【问题标题】:Python3 avoid quoting and extra lines at the end of the csv filePython3 避免在 csv 文件末尾引用和额外的行
【发布时间】:2018-06-07 15:45:28
【问题描述】:

我正在尝试根据之前创建和连接的列表内容创建 CSV 文件。交易是我所有的行记录在每行的开头和结尾都带有双引号。此外,在文件末尾,我得到了一条额外的白线。

代码:

with open('/tmp/'+filename,"w", newline='') as output:
            writer = csv.writer(output)
            for item in update_records:
                row = '{},{},{}'.format(item['field1'],item['field2'],item['field3'])
                #print(row)
                writer.writerow([row])               

        output.close()

当前输出:

我试过了:

writer = csv.writer(output, quotechar='', quoting=csv.QUOTE_MINIMAL)

但我收到如下错误:

如果启用引用,则必须设置quotechar

非常感谢您的支持。

【问题讨论】:

  • quotechar 传递了您要用作引号的字符。传入一个空字符串会让人感到困惑。看看这个SO question
  • 如果你想使用 ' 作为quotechar 比你必须通过quotechar="'"
  • 请考虑@Gelineau 的答案,因为您可能一开始可能不想将其存储在引号中,编写字符串列表就是您想要分隔它们的内容,否则这将不是真正的CSV。
  • output.close() 在使用 with 语句时是不必要的。您想要的输出应该是什么样的?为什么最后的空白行会打扰您,我以前也去过那里,格式正确的 CSV 会有一个行终止符,并且它也必须为最后一个条目终止,使它看起来像它。你可以改变这条规则,但是你必须以书面形式和阅读它的人来处理例外情况。

标签: python python-3.x csv


【解决方案1】:

这里是一个使用 DictWriter 的答案,但是基于数据结构的大量猜测。还有更简单的方法来编写它,例如您将它们作为字典列表。

import csv

update_records = [
    {
        "field1": "field1",
        "field2": "en",
        "field3": "field3"
    },
    {
        "field1": "field1",
        "field2": "de",
        "field3": "field3"
    }
]

filename = "test.csv"

with open('/tmp/'+filename,"w", newline='') as output:
    # Define header, needed even if not written when using DictWriter
    header = ["field1", "field2", "field3"]
    writer = csv.DictWriter(output, fieldnames=header)
    # Optional write the header
    # writer.writeheader()
    for item in update_records:
        row = {}
        # Only provide the fields 1 to 1 that are present in the header.
        # There are plenty of cooler ways to do this, but hope this is clearer.
        for head in header:
            row[head] = item[head]
        # print(row)
        writer.writerow(row)

输出是这样的(/tmp/test.csv)(末尾有一个空行,但是不知道如何将其显示为代码的一部分,因此添加了 EOF):

field1,en,field3
field1,de,field3

EOF

【讨论】:

    【解决方案2】:

    writerow 应该将字段列表作为参数:

    with open('/tmp/'+filename,"w", newline='') as output:
        writer = csv.writer(output)
        for item in update_records:
            row = [item['field1'],item['field2'],item['field3']]
            #print(row)
            writer.writerow(row)               
    

    【讨论】:

    • 使用 with 可以省略 output.close() 因为它会自动完成。如果您可以更新缩进,那就太好了。从解决方案的角度来看,我认为您是正确的,引号字符不是真正的问题(至少现在还不是)
    • 对不起,我刚刚意识到你复制了他的代码并对其进行了修改。
    • 你说得对,我不应该照原样复制代码
    • 这是给:“[field1, 'en', field3]”
    • 鉴于您处理项目的方式,我认为 dictwriter 可能更适合您,但一个简单的示例行将有助于引导您走向成功
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-27
    • 2019-01-28
    • 2012-12-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多