2

月に1回操作する必要のあるCSVファイルが約100個あり、これに頭を悩ませようとしていましたが、壁にぶつかっています。私はPythonについていくつかのことを理解し始めていますが、いくつかのことを組み合わせるとまだ問題が発生するため、これを理解することはできません。

これが私の問題です:

私はたくさんのCSVファイルを持っています、そしてこれが私がする必要があることです:

各行の前に「列」を追加します(または後部は実際には重要ではありませんが、前部が理想的です)。さらに、各行には5行あり(追加されるファイル名は含まれません)、形式は次のとおりです。

6桁のID番号、YYYY-MM-DD(1)、YYYY-MM-DD(2)、YYYY-MM-DD(3)、1桁の番号

特定のディレクトリ内のすべてのCSVについて、ファイル内のすべての行(ヘッダー行がない)について、YYYY-MM-DD(2)からYYYY-MM-DD(3)を減算する必要があります。

ファイルを結合するため(スクリプトに含まれている場合は素晴らしいですが、その部分を理解できると思います)、行内のファイル名が必要です。また、レコードがどのファイルからのものであるかを知る必要があります。ファイル名の形式は常に「4-5-digit-number.csv」です

これが理にかなっていることを願っています。そうでない場合は、お知らせください。どこから始めればいいのかわからないので、実際に機能し始めたサンプルコードはありません。本当にイライラしているので、皆さんが提供してくれる助けに感謝します。このサイトは素晴らしいです!

マイラン

4

2 に答える 2

7

これらの各タスクの標準ライブラリには、次のツールがあります。

ディレクトリ内のすべてのCSVファイルを反復処理するには、次のglobモジュールを使用します。

import glob
for csvfilename in glob.glob(r"C:\mydirectory\*.csv"):
    #do_something

CSVファイルを解析するには、次のcsvモジュールを使用します。

import csv
with open(csvfilename, "rb") as csvfile:
    reader = csv.reader(csvfile, delimiter=",")
    for row in reader:
        # row is a list of all the entries in the current row

日付を解析して差を計算するには、次のdatetimeモジュールを使用します。

from datetime import datetime
startdate = datetime.strptime("1999-10-20", "%Y-%m-%d")
enddate = datetime.strptime("2003-02-28", "%Y-%m-%d")
delta = enddate - startdate # difference in days

行の先頭に値を追加するには:

row[0:0] = [str(delta)]

行の最後にファイル名を追加するには:

row.append(csvfilename)

そして、新しいCSVファイルに行を書き込むには:

with open(csvfilename, "wb") as csvfile:
    writer = csv.writer(csvfile, delimiter=",")
    writer.writerow(row)

すべてをまとめると、次のようになります。

import glob
import csv
from datetime import datetime

with open("combined_files_csv", "wb") as outfile:
    writer = csv.writer(outfile, delimiter=",")
    for csvfilename in glob.glob(r"C:\mydirectory\*.csv"):
        with open(csvfilename, "rb") as infile:
            reader = csv.reader(infile, delimiter=",")
            for row in reader:
                startdate = datetime.strptime(row[3], "%Y-%m-%d")
                enddate = datetime.strptime(row[2], "%Y-%m-%d")
                delta = enddate - startdate # difference in days
                row[0:0] = [str(delta)]
                row.append(csvfilename)
                writer.writerow(row)
于 2011-09-08T16:14:15.627 に答える
0

プログラムの基本的な概要は次のようになります。

  1. osモジュールを使用して、対象のディレクトリ/ディレクトリからファイル名を取得します
  2. 各ファイルを一度に1つずつ読み込みます
  3. ファイルの各行について、次の列に分割します。columns = line.split(",")
  4. 「2011-05-03」のような文字列をdatetime.datesに変換するには、datetime.dateを使用します。
  5. 2番目の日付から3番目の日付を引くと、datetime.timedeltaが生成されます。
  6. すべての情報を必要な形式で入力し(ヒント:str(foo)は、ほぼすべてのタイプのfooの文字列表現を生成します)、後で使用できるように覚えておいてください。
  7. ファイルを閉じて、書き込み用に再度開いて、新しいものを書き込みます
于 2011-09-08T15:57:56.710 に答える