0

我正在尝试为更大的项目打开、转换、操作和保存测试 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)

这是我的外壳输出:

    >>> 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。

4

3 回答 3

2

Pythoncsv模块中用于读取 CSV 文件的默认分隔符csv.reader是逗号,因此如果您的 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 world和中的空格and again被正确解析(即被忽略)。

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

更新:

根据您的编辑,您似乎正在使用自己的代码来解析 CSV 文件——<strong>不要这样做(尤其是如果您只是编程/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]

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

于 2013-09-30T11:43:50.270 回答
1

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

writer = csv.writer(csvfile, delimiter=',', quotechar='"', quoting=csv.QUOTE_ALL)
于 2013-09-30T20:10:35.820 回答
0

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

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

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

于 2013-09-30T12:05:28.590 回答