Python 使用csv.reader和csv.writer写入同一个文件而不是不同的文件?
如何将以下代码转换为写入同一文件,而不必写入新文件Python 使用csv.reader和csv.writer写入同一个文件而不是不同的文件?,python,csv,python-2.7,Python,Csv,Python 2.7,如何将以下代码转换为写入同一文件,而不必写入新文件 import csv import itertools from operator import itemgetter def filter_data(data): for classname, group in itertools.groupby(data, itemgetter(2)): filtered_group = [line for line in group] new_count = le
import csv
import itertools
from operator import itemgetter
def filter_data(data):
for classname, group in itertools.groupby(data, itemgetter(2)):
filtered_group = [line for line in group]
new_count = len(filtered_group)
for line in filtered_group:
if line[5] == "Count":
line[5] = "Counter"
else:
line[5] = new_count
yield line
with open('main.csv', 'rb') as f_in, open('main1.csv', 'wb') as f_out:
reader = csv.reader(f_in)
writer = csv.writer(f_out)
writer.writerows(filter_data(reader))
我的尝试如果stringio什么不起作用
import csv
import itertools
from operator import itemgetter
import StringIO
def filter_data(data):
for classname, group in itertools.groupby(data, itemgetter(2)):
filtered_group = [line for line in group]
new_count = len(filtered_group)
for line in filtered_group:
if line[5] == "Count":
line[5] = "Counter"
else:
line[5] = new_count
yield line
output = StringIO.StringIO()
with open('../main.csv', 'rb') as f_in:
reader = csv.reader(f_in)
output.writelines(filter_data(reader))
contents = output.getvalue()
output.close()
with open('../main_test.csv', 'wb') as f_out:
f_out.writelines(contents)
请尝试以下操作:
代码
这应该会起作用:)请尝试以下操作:
代码
这应该是可行的:)当您在读取文件时写入文件时,会发生什么情况?@martineau it可能会出错,我正在请求帮助转换它,以便它在完成它需要做的事情或解决这个问题的方法之前不会写入…只需将它写入一个临时文件,然后删除原始文件,并将其名称命名为临时文件。如果文件很小,您可以使用
StringIO
模块将临时文件写入内存,然后再将其复制到一个真实的文件中。@martinau我不知道如何将其输入到这个文件中……您尝试使用StringIO
基本上看起来没问题。我认为问题在于,filter\u data()
产生的是list
对象而不是字符串,writelines()
希望得到一个字符串序列,而且它们需要以换行符终止,因为您试图创建一个csv文件。尝试yield','。加入(map(str,line))+'\n'
,看看这是否有帮助。如果没有,请在您的问题中添加一些示例数据供我使用,我将进一步研究。当您在读取文件时写入文件时,您预计会发生什么情况?@martineau it出错,我正在请求帮助转换它,以便它在完成它需要做的事情或解决这个问题的方法之前不会写入…只需将它写入一个临时文件,然后删除原始文件,并将其名称命名为临时文件。如果文件很小,您可以使用StringIO
模块将临时文件写入内存,然后再将其复制到一个真实的文件中。@martinau我不知道如何将其输入到这个文件中……您尝试使用StringIO
基本上看起来没问题。我认为问题在于,filter\u data()
产生的是list
对象而不是字符串,writelines()
希望得到一个字符串序列,而且它们需要以换行符终止,因为您试图创建一个csv文件。尝试yield','。加入(map(str,line))+'\n'
,看看这是否有帮助。如果没有,请在您的问题中添加一些示例数据供我使用,我将进一步研究。
import csv
import itertools
from operator import itemgetter
import StringIO
def filter_data(data):
for classname, group in itertools.groupby(data, itemgetter(2)):
filtered_group = [line for line in group]
new_count = len(filtered_group)
for line in filtered_group:
if line[5] == "Count":
line[5] = "Counter"
else:
line[5] = new_count
yield ','.join(map(str, line)) + '\n'
output = StringIO.StringIO()
with open('../main.csv', 'rb') as f_in:
reader = csv.reader(f_in)
output.writelines(filter_data(reader))
contents = output.getvalue()
output.close()
with open('../main.csv', 'wb') as f_out:
f_out.writelines(contents)