我得到了一个csv文件,其中包含正常的字符串,整数,浮点数和一个包含字节的列,我需要对其进行编码。我设法编码了它,但现在发生了两件事:
输入片段:
"text";"6";"1";"ez??R?+??a)???Cs";156156;1561650;0;0;0;74;1720;2012-02-04:486486;"text";"text";"text";"text";490084;49096;False;"{96EE5602-ABD7-4872-A867-5C8D5B28518F}";1;True
到目前为止我的代码:
import csv
import base64
with open('input.csv', 'r') as file, open ('output.csv', 'w') as f_out:
readCSV = csv.reader(file, delimiter=';')
writeCSV = csv.writer(f_out,delimiter=';', lineterminator= '\r\n')
for row in readCSV:
base64_string = base64.urlsafe_b64encode(str.encode(row[3]))
writeCSV.writerow(row)
输出:
text;6;1;ez??R?+??a)???Cs;156156;1561650;0;0;0;74;1720;2012-02-04:486486;text;text;text;text;490084;49096;False;{96EE5602-ABD7-4872-A867-5C8D5B28518F};1;True
text;6;1;ez??R?+??a)???Cs;156156;1561650;0;0;0;74;1720;2012-02-04:486486;text;text;text;text;490084;49096;False;{96EE5602-ABD7-4872-A867-5C8D5B28518F};1;True
text;6;1;ez??R?+??a)???Cs;156156;1561650;0;0;0;74;1720;2012-02-04:486486;text;text;text;text;490084;49096;False;{96EE5602-ABD7-4872-A867-5C8D5B28518F};1;True
text;6;1;ez??R?+??a)???Cs;156156;1561650;0;0;0;74;1720;2012-02-04:486486;text;text;text;text;490084;49096;False;{96EE5602-ABD7-4872-A867-5C8D5B28518F};1;True
text;6;1;ez??R?+??a)???Cs;156156;1561650;0;0;0;74;1720;2012-02-04:486486;text;text;text;text;490084;49096;False;{96EE5602-ABD7-4872-A867-5C8D5B28518F};1;True
text;6;1;ez??R?+??a)???Cs;156156;1561650;0;0;0;74;1720;2012-02-04:486486;text;text;text;text;490084;49096;False;{96EE5602-ABD7-4872-A867-5C8D5B28518F};1;True
text;6;1;ez??R?+??a)???Cs;156156;1561650;0;0;0;74;1720;2012-02-04:486486;text;text;text;text;490084;49096;False;{96EE5602-ABD7-4872-A867-5C8D5B28518F};1;True
所以:
如何摆脱空行,如何确保""来自字符串列的引号保持不变。编码字节列也应该成为一个字符串。
任何帮助将不胜感激!
答案 0 :(得分:3)
像这样定义你的作家。如果您以后使用writerow(就像您一样),则不需要添加额外的换行符。
writeCSV = csv.writer(f_out,delimiter=';',quotechar='"', quoting=csv.QUOTE_NONNUMERIC)
更多魔法here
您也可以尝试将行编辑为字符串
import base64
with open('input.csv', 'r') as f, open ('output.csv', 'w') as f_out:
content = f.readlines()
for row in content:
values = row.split(';')
values[3] = base64.urlsafe_b64encode(str.encode(values[3]))
f_out.write(values.join(';'))
请注意,在这种情况下,不应该是任何字符串中的任何分号。我没有测试过编码,但是你可能还需要处理字节值的引用(即首先是.strip('“'),然后再将它们添加进去)
答案 1 :(得分:0)
部分答案:
问题在于,在阅读时,product1
会将其读取的每一行都转换为csv.reader
个字符串(如果您仔细阅读文档,那么您会看到一个读者吗?不执行自动数据类型转换!
如果你在阅读后没有进行任何类型的转换,那么当你写信时,你最终会把所有内容都放在引号上......因为你写的所有东西都是一个字符串。