【问题标题】:Writing csv file in Python: unwanted commas appear在 Python 中编写 csv 文件:出现不需要的逗号
【发布时间】:2013-06-30 14:29:19
【问题描述】:

我正在尝试使用以下代码将字典值列表提取到文件中:

import csv

def function(file, output, deli = ','):

    dictionary = dict()
    with open(file, 'r') as source, open(output, 'w') as outp:
        data = csv.reader(source)
        line0 = next(data)
        i = 0
        for element in line0:
            dictionary[i] = element
            i += 1
        my_writer = csv.writer(outp)
        for element in dictionary.values():
            print(element)
            my_writer.writerow(element)

if __name__ == '__main__':
    from sys import argv
    if len(argv) == 2:
        function(argv[1])
    elif len(argv) == 3:
        function(argv[1], argv[2])
    elif len(argv) == 4:
        function(argv[1], argv[2], argv[3])

    print("ok")

要在 shell 上运行此代码,我使用以下命令: python function.py 输入输出

但是,尝试使用 csv 文件,例如: 阿尔法,贝塔,伽马,德尔塔

我得到以下结果:

a,l,p,h,a

 ,b,e,t,a

 ,g,a,m,m,a

 ,d,e,l,t,a

我尝试将分隔符更改为“”,但使用空格而不是逗号得到了相同的结果。

我错过了什么吗?

【问题讨论】:

  • 您得到的输出与您期望的输出有何不同?
  • 我期望拥有:alpha、beta、gamma、delta
  • @bigTree 你想用dict 做什么?
  • @JonClements 我创建了字典以方便地访问 line0 中的元素(实际上,原始 csv 文件每列有一个元素,我想检索每个元素的列号)
  • 具有0,1,2,3, 键的字典可能可以替换为列表

标签: python csv


【解决方案1】:

问题出在线条上

for element in dictionary.values():
    print(element)
    my_writer.writerow(element)

docs 参数到writerow 应该是一个对象列表。在您的情况下,参数是一个字符串(可迭代)。 所以你实际上在做的是my_writer.writerow("alpha"),写成a,l,p,h,a

你应该这样做

my_writer.writerow(element.values())

此外,由于您的 CSV 字符串是 alpha, beta, gamma,因此您得到了前导逗号。所以当分裂发生时,元素是['aplha',' beta',' gamma',]。您可以使用strip() 删除它们

【讨论】:

  • 就是这样!我尝试了将列表作为 writerows 输入的代码,它可以工作。
【解决方案2】:

您正在循环遍历行中的字符而不是实际元素

with open(file_, 'r') as source, open(output, 'w') as outp:
    data = csv.reader(source, delimiter=deli)
    #line0 = next(data)
    i = 0
    for element in data:
        dictionary[i] = element
        i += 1

在这种情况下,您将覆盖fileinstead PEP 008 recommends that you add an underscore to the end of you variable name,不覆盖内置函数也被认为是一种好习惯。

【讨论】:

  • 我实际上用 next(data) 检索了文件的第一行(我正在处理的 csv 文件很大,我只需要第一行)
猜你喜欢
  • 1970-01-01
  • 2022-01-23
  • 2016-03-07
  • 2015-01-05
  • 2018-12-16
  • 1970-01-01
  • 2014-06-26
相关资源
最近更新 更多