2017-10-18 86 views
0

我保存为.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: , 

回答

1

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=Nonecsv.writer对象指定消除周围的值双引号被保存

+0

工程就像一个迷人的!我知道这是默认分隔符,这就是为什么我最终想要“智能”格式的原因。如何分裂:导致每一行都有一个新行,? – idkfa

+0

@idkfa,每个“”400“:0.1”序列被认为是一个字段。通过':'拆分序列将给出一个值作为输出文件 – RomanPerekhrest

+0

的独立行的值列表。因此,因为我的数据的格式为field1,field2,field3拆分每个字段将导致一个新的行?因此,当我在part1_field1和part2_field1中分割field1时,它会自动转换为part1_field1,part2_field1 \ n?那很整齐。 – idkfa

0

如果你看一下文档中,write_row,它说:

写行参数笔者的文件 对象,格式化根据当前方言。

但是,你在你的代码

csv_writer.writerow(reader) 

写整个字符串,因为reader在这一点上的字符串。 现在,您想要在CSV文件中使用的格式在问题中未明确提及。但正如您所说,如果您可以执行一些预处理来创建列表的列表并将每个子列表传递到writerow(),则应该能够生成所需的文件格式。

+0

这个答案definitly帮助我理解我在我的writerow的使用错误,但对如何分割我的文件是正确相较于其他答案缺少的重要组成部分。我对任何一种格式都可以,但我认为我的“智能”格式应该是csv文件最常用的格式。 – idkfa

1

您需要拆分t他重视形成一个列表来代表一排。目前代码将字符串拆分为单个字符来表示行。

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])