我是一个新手,所以请耐心等待,到目前为止我只使用终端通过grep和split来操作csv文件。
我有一个相当大的制表符分隔文件(500多MB),我需要根据特定列中的条件进行过滤。即我想从Header5中选择值为.error In Header4和C1的所有行,并将其写入新文件:
<<
基于上面的例子,新文件只有以下几行:
Header1 Header2 Header3 Header4 Header5 Header6
Value1 Value2 Value3 .error C1 Value6
Value1 Value2 Value3 .Notice C1 Value6
Value1 Value2 Value3 .error C2 Value6
Value1 Value2 Value3 .error C1 Value6
Value1 Value2 Value3 .Main C2 Value6
答案 0 :(得分:1)
使用csv
模块。
import csv
output = []
with open('<your_csv_file_to_read>', 'rb') as csvfile:
spamreader = csv.reader(csvfile, delimiter='\t')
for row in spamreader:
if 'Header1' in row or row[3] == '.error':
output.append(row)
with open('<your_csv_file_to_write>', 'wb') as csvfile:
spamwriter = csv.writer(csvfile, delimiter='\t')
for row in output:
spamwriter.writerow(row)
修改强>
为了提高性能效率,我们可以同时打开这两个文件,然后我们不需要在output
变量中存储已过滤的行。
import csv
output = []
with open('<your_csv_file_to_read>', 'rb') as csvfile1, open('<your_csv_file_to_write>', 'wb') as csvfile2:
spamreader = csv.reader(csvfile1, delimiter='\t')
spamwriter = csv.writer(csvfile2, delimiter='\t')
for row in spamreader:
if 'Header1' in row or row[3] == '.error':
spamwriter.writerow(row)
答案 1 :(得分:1)
我建议您使用pandas
包。 Pandas是一个非常强大的数据操作库。有了它,您只需几行代码即可完成此任务:
import pandas as pd
df = pd.read_table( INPUT_FILENAME ) #read in the file
df = df.query('Header4 == ".error"') #select the rows where Header4 == ".error"
df.to_csv( OUTPUT_FILENAME, sep='\t') #write the output to a tab-separated file
INPUT_FILENAME和OUTPUT_FILENAME是分别提供输入和输出文件路径的字符串。
如果您无法安装pandas
,您也可以通过一次阅读一行来解决此问题,并将其拆分为&#39; \ t&#39;检查列表中的正确项目,然后只写入符合条件的那些行。