我想通过拆分行来从现有的csv创建一个csv。
输入csv:
A,R,T,11,12,13,14,15,21,22,23,24,25
输出csv:
A,R,T,11,12,13,14,15
A,R,T,21,22,23,24,25
到目前为止,我的代码如下:
def update_csv(name):
#load csv file
file_ = open(name, 'rb')
#init first values
current_a = ""
current_r = ""
current_first_time = ""
file_content = csv.reader(file_)
#LOOP
for row in file_content:
current_a = row[0]
current_r = row[1]
current_first_time = row[2]
i = 2
#Write row to new csv
with open("updated_"+name, 'wb') as f:
writer = csv.writer(f)
writer.writerow((current_a,
current_r,
current_first_time,
",".join((row[x] for x in range(i+1,i+5)))
))
#do only one row, for debug purposes
return
但该行包含双引号,我无法摆脱:
A002,R051,02-00-00,"05-21-11,00:00:00,REGULAR,003169391"
我尝试使用writer = csv.writer(f,quoting=csv.QUOTE_NONE)
并获得了_csv.Error: need to escape, but no escapechar set
。
删除这些引号的正确方法是什么?
答案 0 :(得分:1)
我认为你可以简化逻辑,将每一行分成两行:
def update_csv(name):
with open(name, 'rb') as file_:
with open("updated_"+name, 'wb') as f:
writer = csv.writer(f)
# read one row from input csv
for row in csv.reader(file_):
# write 2 rows to new csv
writer.writerow(row[:8])
writer.writerow(row[:3] + row[8:])
答案 1 :(得分:0)
writer.writerow
期望迭代,以便它可以将iterable中的每个项目作为一个项目(由适当的分隔符分隔)写入文件。所以:
writer.writerow([1, 2, 3])
会将"1,2,3\n"
写入文件。
您的调用为其提供了一个可迭代的,其中一个项是已包含分隔符的字符串。因此,它需要一些方法来逃避分隔符或引用该项目的方法。例如,
write.writerow([1, '2,3'])
不仅仅是"1,2,3\n"
,而是'1,"2,3"\n'
- 字符串在输出中计为一个项。
因此,如果你想在输出中没有引号,你需要提供一个转义字符(例如'/'
)来标记不应该被计算的分隔符(给出{{1}之类的内容})。
但是,我认为您实际想要做的是将所有这些元素作为单独的项目包含在内。 不要 "1,2/,3\n"
他们自己,尝试:
",".join(...)
将writer.writerow((current_a, current_r,
current_first_time, *row[i+2:i+5]))
中的相关项目作为元组中的单独项目提供。