2016-08-23 6 views
0

ファイル名を追加する際にpythonを使用して複数のcsvファイルを単一のcsvファイルに追加しようとしています(または、ファイルのサブ文字列名前)を新しい変数として追加します。すべてのファイルにヘッダーがあります。次のスクリプトは、ファイルをマージするのトリックを行いますが、変数の問題としてファイル名カバーしていない。何か良い提案がある場合、私は思っていた複数のcsvファイルを結合してファイル名を変数として保存する -

import glob 

filenames=glob.glob("/filepath/*.csv") 

outputfile=open("out.csv","a") 

for line in open(str(filenames[1])): 
outputfile.write(line) 

for i in range(1,len(filenames)): 
    f = open(str(filenames[i])) 
    f.next() 
    for line in f: 
    outputfile.write(line) 

outputfile.close() 

を。私は約25kの小さなサイズのcsvファイル(それぞれ100KB未満)を持っています。あなたが望むものを達成する

+0

コードから判断すると、すべてのファイルの番号とタイプが同じであるように見えます。これは正しいです?意図的に最初のファイルをスキップしていますか? –

+0

'filenames'はあなたが望むファイル名のリストを含んでいませんか?あなたは何を達成したいと思いますか? – FamousJameous

+0

@FamousJameous私の読書スキルによれば、「ファイル名を変数として保存する」とは、各行の元のファイル名を含む列を出力ファイルに追加することを意味します。 –

答えて

0

あなたはあなたのためのCSVファイルを解析するために、Pythonのcsvモジュールを使用することができ、およびフォーマットします出力。サンプルコード(未テスト):

import csv 

with open(output_filename, "wb") as outfile: 
    writer = None 
    for input_filename in filenames: 
     with open(input_filename, "rb") as infile: 
      reader = csv.DictReader(infile) 
      if writer is None: 
       field_names = ["Filename"] + reader.fieldnames 
       writer = csv.DictWriter(outfile, field_names) 
       writer.writeheader() 
      for row in reader: 
       row["Filename"] = input_filename 
       writer.writerow(row) 

いくつかの注意事項:

  • 必ずファイルを開くためにwithを使用しています。これは、あなたがそれらを完了したときに彼らが再び閉じられることを確認します。コードが入力ファイルを正しく閉じることはありません。
  • CSVファイルはバイナリモードで開く必要があります。
  • インデックスはPythonで0から始まります。コードは最初のファイルをスキップし、2番目のファイルからの行を2回含みます。リストを反復処理したいだけなら、Pythonでインデックスを気にする必要はありません。単に代わりにfor x in my_listを使用してください。
0

単純な変更:最初の行のために

outputfile.write(line) -> outputfile.write(line+',file') 

以降

outputfile.write(line+','+filenames[i]) 
+0

範囲を超えたインデックスを持つforループは反パターンですので、 'filename for filename in'を使用するべきです。 – mdurant

関連する問題