2012-02-09 12 views
1

私はPythonでマージする必要がある2つのタブ区切りcsvファイル(ヘッダー付き)を持っています。Pythonで2つのファイルをマージする方法

また、マージされたファイルでは、ファイルを識別するために最後に列を追加する必要があります。同じ形式でも後で分ける必要があるデータが異なるからです。 したがって、出力の各行にfile1の場合は0、file2の場合は1という 'source'という列を追加します。

私はcsvモジュールを使用していますが、writerowは書き込む各行の間にadditioal改行文字を追加し、このコードはfile2から何も書きません。私はここで間違って何をしていますか?また、行のオブジェクトに余分な列 'source'を追加するにはどうすればよいですか?

import os, csv 

path1 = os.path.abspath("../data/file1.txt") 
path2 = os.path.abspath("../data/file2.txt") 
merged_path = os.path.abspath('../data/output.txt') 

# merge the two files for further processing 
merged_file = csv.writer(open(merged_path, 'a'), delimiter = '\t') 

#file1 
fg = csv.reader(open(path1, 'r'), delimiter = '\t') 

for line in fg: 
    if line[7] != '\N': 
     merged_file.writerow(line) 

#file2 
bg = csv.reader(open(path2, 'r'), delimiter = '\t') 

for line in bg: 
    if line[16] != '\N': 
     merged_file.writerow(line) 

答えて

2

私はこれにdictWriterを使用することをお勧めします。また、csvライブラリでは、binaryモードでファイルを開く必要があるため、コードが機能しません。

import os, csv 

path1 = os.path.abspath("../data/file1.txt") 
path2 = os.path.abspath("../data/file2.txt") 
merged_path = os.path.abspath('../data/output.txt') 

#file1 
fg = csv.DictReader(open(path1, 'rb'), delimiter = '\t') 

fieldnames = fg.fieldnames 
fieldnames.append('source') 
# merge the two files for further processing 
merged_file = csv.DictWriter(open(merged_path, 'ab'), delimiter = '\t', fieldnames=fieldnames) 
merged_file.writeheader() 

for row in fg: 
    row['source'] = os.path.basename(path1) 
    merged_file.writerow(row) 

#file2 
bg = csv.DictReader(open(path2, 'rb'), delimiter = '\t') 

for row in bg: 
    row['source'] = os.path.basename(path1) 
    merged_file.writerow(row) 
+0

ありがとうございます!魅力的に働いた。これが私の最初の本当のpythonコードでした。そのニュアンスを読みやすくしてください。 – sfactor

+0

csvのドキュメントにバイナリモードが必要であると記載されていません。それは例でそれを使用しますが、それについてのいくつかの注意はいいでしょう。 – rplnt

+1

@rplnt(http://docs.python.org/library/csv.html#csv.reader)、 'csvfileがファイルオブジェクトの場合は、 'b'フラグでオープンする必要があります –

関連する問題