1

Pythonでマージする必要がある2つのタブ区切りのcsvファイル(ヘッダー付き)があります。

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

私はcsvモジュールを使用するところまで行きましたが、writerowは、書き込む各行の間に追加の改行文字を追加し、このコードは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) 
4

1 に答える 1

2

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

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)
于 2012-02-09T13:52:21.323 に答える