CSVにヘッダ行を追加する方法はありますか?私はヘッダーを追加する18GBのCSVを持っています。私が見たすべての方法では、CSVをメモリに読み込む必要がありますが、これは明らかに実行不可能です。CSVをロードせずにCSVにヘッダを追加
答えて
だけで、行にそのcsv
モジュールを反復事実を使用しています。メモリはここで節約されます。すべてが行単位で行われます。データが適切に処理されるので、セパレータや出力ファイルの引用符を変更することさえできます。
ファイル全体を書き直す必要があります。最も単純なのはPythonを使用しないことです
echo 'col1, col2, col2,... ' > out.csv
cat in.csv >> out.csv
Pythonベースのソリューションははるかに高いレベルで動作し、非常に遅くなります。結局、18GBは大量のデータです。オペレーティングシステムの機能を使用する方が良いでしょう。それは非常に良いスピードを確保writerows
を使用してメモリに
import csv
with open("huge_csv.csv") as fr, open("huge_output.csv","w",newline='') as fw:
cr = csv.reader(fr)
cw = csv.writer(fw)
cw.writerow(["title1","title2","title3"])
cw.writerows(cr)
をファイル全体をロードしたことがないので、
そして、Pythonを離れたくないなら、いつでも 'subprocess.call()'呼び出しでこれをラップすることができます。あるいは、@ maximilian-petersの答えのように、Pythonの最初の行を書くことさえできます。 –
これは実際には最も速い解決策です。他の答えのベンチマークを参照してください。 –
@MaximilianPetersに時間を割いて比較していただきありがとうございます – e4c5
ここでは、10^6行と10個の列(n = 50)の〜200 MBのCSVファイルに対する3つの推奨ソリューションの比較を示します。 大小のファイル(10 MB〜8 GB)の比率はほぼ同じです。
CP:shutil:1時10分55秒
すなわちcsv_reader組み込みcp
関数を使用して、Pythonのcsv
モジュールを使用するよりも約55倍高速です。
コンピュータ:
- 通常のHDD
- のPython 3.5.2 64ビット
- のUbuntu 16.04
- i7-3770
import csv
import random
import shutil
import time
import subprocess
rows = 1 * 10**3
cols = 10
repeats = 50
shell_script = '/tmp/csv.sh'
input_csv = '/tmp/temp.csv'
output_csv = '/tmp/huge_output.csv'
col_titles = ['titles_' + str(i) for i in range(cols)]
with open(shell_script, 'w') as f:
f.write("#!/bin/bash\necho '{0}' > {1}\ncat {2} >> {1}".format(','.join(col_titles), output_csv, input_csv))
with open(shell_script, 'w') as f:
f.write("echo '{0}' > {1}\ncat {2} >> {1}".format(','.join(col_titles), output_csv, input_csv))
subprocess.call(['chmod', '+x', shell_script])
run_times = dict([
('csv_writer', list()),
('external', list()),
('shutil', list())
])
def random_csv():
with open(input_csv, 'w') as csvfile:
csv_writer = csv.writer(csvfile, delimiter=',')
for i in range(rows):
csv_writer.writerow([str(random.random()) for i in range(cols)])
with open(output_csv, 'w'):
pass
for r in range(repeats):
random_csv()
#http://stackoverflow.com/a/41982368/2776376
start_time = time.time()
with open(input_csv) as fr, open(output_csv, "w", newline='') as fw:
cr = csv.reader(fr)
cw = csv.writer(fw)
cw.writerow(col_titles)
cw.writerows(cr)
run_times['csv_writer'].append(time.time() - start_time)
random_csv()
#http://stackoverflow.com/a/41982383/2776376
start_time = time.time()
subprocess.call(['bash', shell_script])
run_times['external'].append(time.time() - start_time)
random_csv()
#http://stackoverflow.com/a/41982383/2776376
start_time = time.time()
with open('header.txt', 'w') as header_file:
header_file.write(','.join(col_titles))
with open(output_csv, 'w') as new_file:
with open('header.txt', 'r') as header_file, open(input_csv, 'r') as main_file:
shutil.copyfileobj(header_file, new_file)
shutil.copyfileobj(main_file, new_file)
run_times['shutil'].append(time.time() - start_time)
print('#'*20)
for key in run_times:
print('{0}: {1:.2f} seconds'.format(key, run_times[key][-1]))
print('#'*20)
print('Averages')
for key in run_times:
print('{0}: {1:.2f} seconds'.format(key, sum(run_times[key])/len(run_times[key])))
あなたが本当にPythonでそれをしたい場合は、最初にヘッダファイルを作成し、shutil.copyfileobj
を経由して2回目の自分のファイルにマージできます。
import shutil
with open('header.txt', 'w') as header_file:
header_file.write('col1;col2;col3')
with open('new_file.csv', 'w') as new_file:
with open('header.txt', 'r') as header_file, open('main.csv', 'r') as main_file:
shutil.copyfileobj(header_file, new_file)
shutil.copyfileobj(main_file, new_file)
- 1. 私のリスト(csv)にヘッダを追加するには
- 2. Powershellに空白のCSVにヘッダを追加する
- 3. csv Matlabにヘッダ付きの新しいカラムを追加
- 4. 解析されたcsv-cにヘッダを追加する#
- 5. RubyのCSVは、私はまた、例えば、csvファイルに追加取得ループヘッダーでcsvファイルにデータを追加していますが、ヘッダ
- 6. フォーマットを変更せずにCSVファイルに行を追加する(Python)
- 7. は、パイソンを使用してCSVファイルに列ヘッダを追加するJSON
- 8. php CSVヘッダのカラム
- 9. リモートcsvファイルをダウンロードせずに読む
- 10. データをCSVにエクスポートおよび追加
- 11. PHPでcsvファイルにカラム名を追加
- 12. CSVにウォーターマークを追加する方法
- 13. CSVファイルに列を追加する
- 14. コピーコマンドpostgresをCSVファイルに追加
- 15. CSVの先頭に列を追加
- 16. csvファイルにヘッダーを追加する
- 17. JSのCSV-Textfileにメタデータを追加
- 18. CHCSVParserにリモートcsvをロード
- 19. CSVをコアデータマネージドsqlite dbにロード
- 20. JavaScriptファイルにCSVファイルをロード
- 21. xmllint:ヘッダを追加せずにフォーマットする
- 22. 大きなUNICODE csvファイルをUTF-8 CSVに変換せずに変換する
- 23. CSVをアップロードしてCSVを保存せずにPaperclipで処理する
- 24. NEO4J 3.1.1 CSVをロード
- 25. Pythonを使用して.csvファイルを別の.csvファイルに追加します
- 26. CSVファイルの比較を使用したCSVの追加
- 27. Netezza CSVのロード
- 28. 1つのCSVファイルから別のCSVファイルに列を追加する
- 29. csvファイルから新しいcsvファイルに特定の列を追加する
- 30. MySQLにCSVをロードするには?
DictWriterの書き込みヘッドメソッドを試しましたか? (https://docs.python.org/3/library/csv.html) 正確な答えはわかりませんが、ちょっとしたアイデア:「a」でファイルを開いてwriteheaderを使用しようとすると、それは動作しますか? 何か問題がある場合は、元のファイルのコピーを試してみるとよいでしょう。 – Kroy
3つの方法の速度比較については、更新された回答を参照してください。 –