【问题标题】:Python CSV delimeter defaulting to ' '?Python CSV 分隔符默认为“”?
【发布时间】:2013-09-30 11:28:12
【问题描述】:

我正在尝试为一个更大的项目打开、转换、操作和保存一个测试 CSV 文件。到目前为止,我已经打开了文件,将其转换为列表并对其进行了操作。但我无法将其保存为格式正确的 CSV 文件。

目前,它可以保存,但由于某种未知原因,每列的分隔符似乎是 ' '。我的数据集基于已售房价/位置/日期,因此每当时间(数据和时间之间)和位置(街道名称、城镇等之间)出现中断时,我都会得到一个新列,而所有其他没有空格的数据(价格、身份证号等)都放在同一列中,搞砸了我的数据。

另一方面,由于某些奇怪的原因,我的 csv 文件在每行之间保留了几个空行。我不知道发生了什么。

这是代码中有问题的部分:

def write_new_file(lst, new_file):
'''(lst)->.CSV file
Takes a list and writes it into a .CSV file.
'''
    writer = csv.writer(new_file, delimiter=',')
    writer.writerows(lst)
    new_file.close()

这是我在 shell 中的输出:

>>> doc[0]

['{AACDC187-2E3E-4705-BCF3-0001C4187ADD},', '208000,', '28/06/2013 00:00,', 'AL23HX,', 'F,', 'N,', 'L,', '17,', ',', 'TENNYSON ROAD,', ',', 'ST ALBANS,', 'ST ALBANS,', 'HERTFORDSHIRE,']

感谢任何帮助!

编辑:我已经编程了几个星期了,如果我是个白痴,请见谅!

编辑 4:

我已更改我的代码以使用 csv.reader 函数,该函数运行良好,并且使程序更小。现在看起来像这样:

    #create an empty variable

doc= []

with open(file2, 'r') as f:
    reader = csv.reader(f, delimiter=',')
    for row in reader:
        doc.append(row)

这是我的 shell 输出:

    >>> doc[0]
['{AACDC187-2E3E-4705-BCF3-0001C4187ADD}', '208000', '28/06/2013 00:00', 'AL2 3HX', 'F', 'N', 'L', '17', '', 'TENNYSON ROAD', '', 'ST ALBANS', 'ST ALBANS', 'HERTFORDSHIRE', 'A']

但我的 CSV 输出是相同的,列是根据字符串中的空格而不是根据分隔列表项的逗号分隔的。而且行之间还有一个空行。

我的写作功能没有改变。

最终编辑:已解决! calc 最终搞砸了,而不是 Python。

【问题讨论】:

  • 请同时显示读取文件的代码。这就是问题所在。
  • 谢谢蒂姆我添加了代码。
  • 这实际上并没有打开文件。你用什么代码将文件读入doc
  • 你既没有展示你作为'lst'传递给你的函数的东西,也没有展示doc是什么以及你是如何构建它的,所以我们无能为力。请阅读:sscce.org
  • 您应该使用csv.reader 重新读取文件,而不是滚动您自己的 csv 阅读器。请参阅 Erik 的回答。

标签: python csv python-3.x export-to-csv


【解决方案1】:

Python csv 模块中用于读取带有csv.reader 的CSV 文件的默认分隔符是逗号,因此如果您的CSV 文件使用delimiter=',' 保存,它也应该默认正确读取,除非您明确指定一个错误的分隔符值。

CSV 文件内容:

foo,bar,baz
hello world,again,and again

代码:

>>> list(csv.reader(open('test.csv', 'rb')))
[['foo', 'bar', 'baz'], ['hello world', 'again', 'and again']]

如您所见,hello worldand again 中的空格被正确解析(即被忽略)。

要了解为什么您的代码不能按您希望的那样工作,您必须向我们展示更多(相关部分)您的代码。

更新:

根据您的编辑,您似乎正在使用自己的代码来解析 CSV 文件——不要这样做(尤其是如果您只是编程/Python 的初学者) .使用内置的csv 模块。

with open('test.csv', 'rb') as f:
    reader = csv.reader(f, delimiter=',')
    for row in reader:
        ...
    # or just rows = list(reader)

此外,您的 CSV 解析代码效率极低,并且可能(或者,显然)有问题;但我并没有真正通过它来尝试找到错误,因为您可以自己完成(出于学习目的 - 对于实际代码,请使用 csv.reader)。

更高效的 CSV 解析代码的一个简单示例是:

with open(filename, 'rb') as f:
    rows = [line.split(',') for line in f]

...但这不考虑引用;实现引用支持不会那么简单,可能会使用正则表达式或解析代码。

【讨论】:

  • 所以我将它作为我在 shell 中的输出,而不是在我的 CSV 文件中。并且我的分隔符在上面的代码中保持为“,”所以不确定我哪里出错了!
  • 谢谢埃里克。这真的让我的解析代码看起来好多了。但最初的问题仍然存在,即由字符串中的空格而不是列表中的逗号分隔。
  • 让我直截了当地说:您需要逗号还是空格?如果你需要逗号,我的例子/解释到底怎么不够?如果您需要空间,为什么不在我的示例中将delimiter=',' 替换为delimiter=' '? ——重点是:如果你使用csv.readercsv.writer 以及delimiter 参数的正确值,你会没事的;如果您正在使用这 2 个并且仍然在 CSV 中得到错误的输出,请打开一个新问题(如果您仍然无法调试它)。
  • 另外,请确保您的输入数据(首先写入 CSV 的数据)是正确的——因为您没有向我们展示您的数据和 CSV 文件的内容包含您不满意的内容。
  • 不确定你在问什么;如果这是不平凡的事情,最好问一个新问题。 cmets 并不是为此而设计的。而且你的名声太小,我不能拿这个去聊天。
【解决方案2】:

您也可以尝试设置 quotechar 和 qutoting:

writer = csv.writer(csvfile, delimiter=',', quotechar='"', quoting=csv.QUOTE_ALL)

【讨论】:

    【解决方案3】:

    我认为问题的原因在于您的 CSV 解析代码 - 您似乎将逗号分隔符留在了数据中。

    当您将其写入 CSV 文件时,CSV 模块发现数据中有逗号,并使用单引号字符引用数据,因此当您再次读回数据时,它可以区分数据中的逗号分隔符和逗号。

    如果您修复阅读器以删除逗号分隔符,问题应该会消失。

    【讨论】:

      猜你喜欢
      • 2010-11-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-24
      • 2016-04-03
      • 2021-12-17
      相关资源
      最近更新 更多