我尝试通过插入行来修改csv,但在关闭CSV之前,还要循环迭代以将附加列附加到CSV。我尝试了各种不同的方法,但似乎一旦完成writerows
函数,下一步就不会处理任何writerows
。有没有这样做的方法,或者我必须保存writerows
结果,重新打开CSV文件,然后完成追加?我已经将rows
插入CSV,然后注解掉output.writerows(rows)
,for
循环在这种情况下确实有效。但是,插入writerows
后,它不再像我希望的那样工作,因为它跳过了在函数过程中编写的任何内容。
下面是我一直在使用的一些示例代码:
import csv
import itertools
import uuid
from datetime import datetime
rows = [[1000000, 'Test', 'Test', 179, 1111, 222, 5, 'Test', 'Test', 1111, 'Test', 222, 'Test', 1111, 22222, 'Test', '', 1, 2],
[1000000, 'Test', 'Test', 179, 1111, 222, 5, 'Test', 'Test', 1111, 'Test', 222, 'Test', 1111, 22222, 'Test', '', 1, 2],
[1000000, 'Test', 'Test', 179, 1111, 222, 5, 'Test', 'Test', 1111, 'Test', 222, 'Test', 1111, 22222, 'Test', '', 1, 2],
[1000000, 'Test', 'Test', 179, 1111, 222, 5, 'Test', 'Test', 1111, 'Test', 222, 'Test', 1111, 22222, 'Test', '', 1, 2],
[1000000, 'Test', 'Test', 179, 1111, 222, 5, 'Test', 'Test', 1111, 'Test', 222, 'Test', 1111, 22222, 'Test', '', 1, 2],
[1000000, 'Test', 'Test', 179, 1111, 222, 5, 'Test', 'Test', 1111, 'Test', 222, 'Test', 1111, 22222, 'Test', '', 1, 2],
[1000000, 'Test', 'Test', 179, 1111, 222, 5, 'Test', 'Test', 1111, 'Test', 222, 'Test', 1111, 22222, 'Test', '', 1, 2],
[1000000, 'Test', 'Test', 179, 1111, 222, 5, 'Test', 'Test', 1111, 'Test', 222, 'Test', 1111, 22222, 'Test', '', 1, 2],
[1000000, 'Test', 'Test', 179, 1111, 222, 5, 'Test', 'Test', 1111, 'Test', 222, 'Test', 1111, 22222, 'Test', '', 1, 2]]
def _sanitize_report(source_file, dest_file, append_timestamp, timestamp_format, append_filename, file,
append_id):
with open(source_file, 'r') as report:
reader = csv.reader(report)
with open(dest_file, 'w') as output_file:
data_rows = 0
output = csv.writer(output_file)
output.writerows(rows)
for index, row in enumerate(reader):
if append_timestamp and append_filename and append_id:
output.writerow(itertools.chain([datetime.today().strftime(timestamp_format)],
[str(file).replace(file[0:3], '')],
[uuid.uuid4()]))
elif append_timestamp and append_filename:
output.writerow(itertools.chain([datetime.today().strftime(timestamp_format)],
[str(file).replace(file[0:3], '')]))
elif append_timestamp and append_id:
output.writerow(itertools.chain([datetime.today().strftime(timestamp_format)], [uuid.uuid4()]))
elif append_filename and append_id:
output.writerow(itertools.chain([str(file).replace(file[0:3], '')], [uuid.uuid4()]))
elif append_timestamp:
output.writerow(itertools.chain( [datetime.today().strftime(timestamp_format)]))
elif append_filename:
output.writerow(itertools.chain([str(file).replace(file[0:3], '')]))
elif append_id:
output.writerow(itertools.chain([uuid.uuid4()]))
else:
output.writerow([value.replace('(not set)', '') for value in row])
data_rows += 1
_sanitize_report('test.csv', 'test_' + str(uuid.uuid4()) + '.csv',
append_timestamp=True, timestamp_format=datetime.utcnow().isoformat() + 'Z',
append_filename=True, file='123Test_success', append_id=True)
我所寻找的最终结果是让用户决定需要追加到结果中的内容,并将文件保存到一个新的位置。这可能在一个函数中完成吗?还是必须将其分解?我尝试了多种不同的方法,但都没有成功,我已经这样做了大约一个星期了。
在这方面的任何帮助将是令人难以置信的感激!
1条答案
按热度按时间yebdmbv41#
当您在调用writerows()之后,又调用了若干次writerrow()时,会发生什么情况?
发生这种情况:
如果调用writerows()时列表中已经有了单独的行,或者调用writerrow()迭代行列表,也会发生同样的情况。
writerrow()写入单个行,而writerows()写入行列表。
如果你想有选择地在数据中添加一些列,你需要在调用writerrow()或writerows()之前将这些列添加到行中。