【发布时间】:2020-04-18 08:05:19
【问题描述】:
我正在尝试读取 csv 文件并根据其中的前 2 列写入内容,并带有序列号。这一切都很好..但我的挑战是附加文件而不是为每一行编写新文件..
test.csv
2002,2402,1,1,1,1,1,1,1,1
2002,2002,2,2,2,2,2,2,2,2
2402,2402,3,3,3,3,3,3,3,3
2002,2402,4,4,4,4,4,4,4,4
3333,2402,5,5,5,5,5,5,5,5
3333,3333,6,6,6,6,6,6,6,6
输出文件:
2002_200418_000000001.csv
1,1,1,1,1,1,1,1
2002_200418_000000002.csv
2,2,2,2,2,2,2,2
2002_200418_000000003.csv
4,4,4,4,4,4,4,4
2402_200418_000000001.csv
1,1,1,1,1,1,1,1
2402_200418_000000002.csv
3,3,3,3,3,3,3,3
2402_200418_000000003.csv
4,4,4,4,4,4,4,4
2402_200418_000000004.csv
5,5,5,5,5,5,5,5
3333_200418_000000001.csv
5,5,5,5,5,5,5,5
3333_200418_000000002.csv
6,6,6,6,6,6,6,6
python code:
import os, csv, datetime
from itertools import cycle
seq = {'2002': cycle(range(1,999)),'2402': cycle(range(1,999)),'3333': cycle(range(1,999))}
def SequenceNum(f):
return f'{next(seq[f])}'.zfill(9)
def filegenerate(X):
with open(X) as csvfile:
timestamp = '_' + '{:%y%m%d%H%M%S}'.format(datetime.datetime.now()) + '_'
reader = csv.reader(csvfile, quotechar="'")
for cdr in reader:
if cdr[0] == '' and cdr[1] == '':
pass
elif cdr[0] == cdr[1]:
with open(cdr[0] + timestamp + SequenceNum(cdr[0]) + '.csv', 'a', newline='') as f:
writer = csv.writer(f, quotechar="'")
writer.writerow(cdr[2:])
f.close()
elif cdr[0] != cdr[1] and cdr[1] != '' and cdr[0] != '':
with open(cdr[0] + timestamp + SequenceNum(cdr[0]) + '.csv', 'a', newline='') as f:
writer = csv.writer(f, quotechar="'")
writer.writerow(cdr[2:])
f.close()
with open(cdr[1] + timestamp + SequenceNum(cdr[1]) + '.csv', 'a', newline='') as f:
writer = csv.writer(f, quotechar="'")
writer.writerow(cdr[2:])
f.close()
elif cdr[1] != '' and cdr[0] == '':
with open(cdr[1] + timestamp + SequenceNum(cdr[1]) + '.csv', 'a', newline='') as f:
writer = csv.writer(f, quotechar="'")
writer.writerow(cdr[2:])
f.close()
elif cdr[0] != '' and cdr[1] == '':
with open(cdr[0] + timestamp + SequenceNum(cdr[0]) + '.csv', 'a', newline='') as f:
writer = csv.writer(f, quotechar="'")
writer.writerow(cdr[2:])
f.close()
if __name__ == '__main__':
filegenerate('test.csv')
从上面的输出中,2002 文件根据行数生成了多次,我想将行附加到相应的文件中。请帮助改进我的代码。
expected output:
2002_200418_000000001.csv
1,1,1,1,1,1,1,1
2,2,2,2,2,2,2,2
4,4,4,4,4,4,4,4
2402_200418_000000001.csv
1,1,1,1,1,1,1,1
3,3,3,3,3,3,3,3
4,4,4,4,4,4,4,4
5,5,5,5,5,5,5,5
3333_200418_000000001.csv
5,5,5,5,5,5,5,5
6,6,6,6,6,6,6,6
我认为这个问题是因为在写入文件时分配了 seq 编号,可能我可以将所有行附加到 2002..etc 文件中,然后用 seq 编号重命名它们。但是有更好的方法吗??
对于提出的为什么需要 seq 的问题,当每个文件以 000000001 结尾时,这是因为当我遍历多个 .csv 文件时,seq 编号将被分配并进一步增加。
example:
test1.csv
test2.csv
test3.csv
output:
2002_200418_000000001.csv
2402_200418_000000001.csv
3333_200418_000000001.csv
2002_200418_000000002.csv
2402_200418_000000002.csv
3333_200418_000000002.csv
2002_200418_000000003.csv
2402_200418_000000003.csv
3333_200418_000000003.csv
我的想法,seq 编号应该分配给每个 .csv,而不是分配给 csv 文件的每一行。 请帮忙...
提前致谢。
【问题讨论】:
-
你的序列号背后的逻辑是什么?
-
在预期的输出中,所有文件都以相同的序列号结尾
000000001?? -
Seq 编号逻辑是当找到 column1 时,正在写入具有该名称的文件(例如 2002),SequenceNum 函数将为该编号本身分配不同的编号..
-
2002,2402,3333是在dict seq下定义的,sequenceNum函数会为这些数字分配不同的seq号。
-
但是如果附加文件,这个序列号真的有必要吗?您最终不会为每个数字 2002、2402、3333 生成一个文件吗?
标签: python python-3.x csv