csv.writer删除引号并添加换行符

时间:2017-05-19 15:31:21

标签: csv python-3.6

我得到了一个csv文件,其中包含正常的字符串,整数,浮点数和一个包含字节的列,我需要对其进行编码。我设法编码了它,但现在发生了两件事:

  1. 删除每个字符串列中的所有引号。
  2. 在每行后添加一个空行。
  3. 输入片段:

    "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
    

    所以:

    如何摆脱空行,如何确保""来自字符串列的引号保持不变。编码字节列也应该成为一个字符串。

    任何帮助将不胜感激!

2 个答案:

答案 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个字符串(如果您仔细阅读文档,那么您会看到一个读者吗?不执行自动数据类型转换!

如果你在阅读后没有进行任何类型的转换,那么当你写信时,你最终会把所有内容都放在引号上......因为你写的所有东西都是一个字符串。