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)