使用逗号读取CSV作为换行符

时间:2017-10-18 11:38:31

标签: python python-3.x csv

我有一个文件保存为.csv

"400":0.1,"401":0.2,"402":0.3

最终,我希望将数据以适当的格式保存在csv文件中,以便进一步处理。问题是文件中没有换行符。

pathname = r"C:\pathtofile\file.csv"    

with open(pathname, newline='') as file:
    reader = file.read().replace(',', '\n')
    print(reader)
    with open(r"C:\pathtofile\filenew.csv", 'w') as new_file:
        csv_writer = csv.writer(new_file)
        csv_writer.writerow(reader)

打印阅读器输出看起来正是我想要的(或者至少它是我可以进一步处理的格式)。

"400":0.1
"401":0.2
"402":0.3

现在我想将其保存到新的csv文件中。但是输出看起来像

"""",4,0,0,"""",:,0,.,1,"
","""",4,0,1,"""",:,0,.,2,"
","""",4,0,2,"""",:,0,.,3

我确信将格式转换为

是明智的
400,0.1
401,0.2
402,0.3

在此阶段而不是稍后使用其他脚本。

主要问题是我目前的代码

with open(pathname, newline='') as file:
    reader = file.read().replace(',', '\n')
    reader = csv.reader(reader,delimiter=':')
    x = []
    y = []
    print(reader)
    for row in reader:
        x.append( float(row[0]) )
        y.append( float(row[1]) )           

print(x)
print(y)

适用于我目前拥有的csv文件类型,但不适用于上述内容:

y.append( float(row[1]) )
IndexError: list index out of range

所以我也想找到一种方法与他们合作。我想我错过了一些明显的东西,因为我认为正确定义文件的换行符和分隔符并不太难。

with open(pathname, newline=',') as file:

产量

ValueError: illegal newline value: ,

3 个答案:

答案 0 :(得分:2)

使用csv模块的正确方法,无需替换并转换为float

import csv

with open('file.csv', 'r') as f, open('filenew.csv', 'w', newline='') as out:
    reader = csv.reader(f)
    writer = csv.writer(out, quotechar=None)
    for r in reader:
        for i in r:
            writer.writerow(i.split(':'))

生成的filenew.csv内容(根据您的" 智能 "条件):

400,0.1
401,0.2
402,0.3

<强> 细微差别

  • csv.readercsv.writer个对象将逗号,视为默认分隔符(无需file.read().replace(',', '\n')

  • quotechar=None对象指定了
  • csv.writer,以消除保存值周围的双引号

答案 1 :(得分:1)

您需要拆分值以形成表示行的列表。目前,代码将字符串拆分为单个字符以表示行。

pathname = r"C:\pathtofile\file.csv"    

with open(pathname) as old_file:
    with open(r"C:\pathtofile\filenew.csv", 'w') as new_file:
        csv_writer = csv.writer(new_file, delimiter=',')
        text_rows = old_file.read().split(",")
        for row in text_rows:
            items = row.split(":")
            csv_writer.writerow([int(items[0]), items[1])

答案 2 :(得分:0)

如果您查看文档,对于write_row,它会说:

  

将row参数写入writer的文件   对象,根据当前方言格式化。

但是,您在代码中编写了整个字符串

csv_writer.writerow(reader)

因为此时reader是一个字符串。 现在,问题中没有明确提到您要在CSV文件中使用的格式。但正如您所说,如果您可以进行一些预处理来创建列表列表并将每个子列表传递给writerow(),您应该能够生成所需的文件格式。