在每行python

时间:2017-07-21 05:41:59

标签: python csv newline

repl.it中的代码执行存在差异(工作正常,可能是因为Python中的错误已被修复/更新),以及IDLE,其中代码无法正常工作。

我已经查阅了文档,并且之前的堆栈溢出答案添加了“换行符”,但问题仍然存在。

你会注意到它的重复,这里:(完美地运作)

https://repl.it/Jbv6/0

然而,在IDLE 上粘贴文件内容(没有换行符)它可以正常工作

001,Joe,Bloggs,Test1:99,Test2:100,Test3:1002,Ash,Smith,Test1:20,Test2:20,Test3:100003003,Jonathan,Peter,Test1:99,Test2:33,Test3:44

但是将文件内容粘贴到txt文件中(应该是新行上的每条记录),如下所示:

001,Joe,Bloggs,Test1:99,Test2:100,Test3:1
002,Ash,Smith,Test1:20,Test2:20,Test3:100003
003,Jonathan,Peter,Test1:99,Test2:33,Test3:44

输出错误如下(在每行后生成一个新列表):

[['001', 'Joe', 'Bloggs', 'Test1:99', 'Test2:100', 'Test3:1'], [], ['002', 'Ash', 'Smith', 'Test1:20', 'Test2:20', 'Test3:100'], ['003'], ['', 'Jonathan', 'Peter', 'Test1:99', 'Test2:33', 'Test3:44']]

代码在这里:

import csv

    #==========1. Open the File, Read it into a list, and Print Contents 
    print("1==============Open File, Read into List, Print Contents")
    #open the file, read it into a list (each line is a list within a list, and the end of line spaces are stripped as well as the individual elements split at the comma)
    with open("studentinfo.txt","rb",newline="") as f:
      studentlist=list(csv.reader(f))

      print(studentlist)

我已经尝试过,正如文档和stackoverflow上的先前答案所示,添加:(换行符)

with open("studentinfo.txt","r",newline="") as f:

不幸的是错误仍然存​​在。

任何有解释的建议/解决方案都将不胜感激。

更新,我也试过了:

with open("studentinfo.txt",newline="") as f:
  reader=csv.reader(f)
  for row in reader:
    print(row)
再次

,它在replit中完美运行

https://repl.it/Jbv6/2

但IDLE中的此错误

1==============Open File, Read into List, Print Contents
['001', 'Joe', 'Bloggs', 'Test1:99', 'Test2:100', 'Test3:1']
[]
['002', 'Ash', 'Smith', 'Test1:20', 'Test2:20', 'Test3:100']
['003']
['', 'Jonathan', 'Peter', 'Test1:99', 'Test2:33', 'Test3:44']
>>> 

对于那些需要能够在repl.it和IDLE中保持一致性的学生来说,这是一个很大的问题,这是他们在学校和家庭环境之间的工作。

任何显示允许它同时使用的代码的答案就是我所追求的。

4 个答案:

答案 0 :(得分:1)

最简单的答案如下:

import csv

# ==========1. Open the File, Read it into a list, and Print Contents 
print("1==============Open File, Read into List, Print Contents")
# open the file, read it into a list (each line is a list within a list,
# and the end of line spaces are stripped as well as the individual
# elements split at the comma)
studentlist = []
with open("studentinfo.txt", "r", newline="") as f:
    for row in csv.reader(f):
        if len(row) > 0:
            studentlist.append(row)
print(studentlist)

但是你的原始代码应该可行 - 我已经运行了它,但是在linux而不是windows上。如果我可以请你做更多工作:

with open("studentinfo.txt", "r", newline="") as f:
    ascii_ch = list(map(ord,f.read()))
    eol_delims = list(map(str,(ch if ch < 32 else '' for ch in ascii_ch)))
    print(",".join(eol_delims))

这会产生,的列表,但会散布13,1010,但可能会出现10,13,10之类的内容。这些是被讨论的\r\n\n,但我想知道您是否设法以某种方式获得第三个选项? 如果是这样,我认为您需要重写该文本文件以获得正常的行结束。

- (更新以回应评论)
我对10,13,10的唯一建议是仅在一个应用程序(例如记事本)中编辑文本文件,而不在另一个应用程序中编辑它。

实际问题来自于在两个应用程序中编辑文件,每个应用程序对行结尾应该是什么有不同的解释(Windows应用程序应该是\r\n,&#34; repl.it&#34;是\n。之前我曾经遇到过,但从未解决过所需的一系列行动。

答案 1 :(得分:1)

尝试使用编解码器并明确指定文件的编码为UTF-8。

import csv
import codecs

print("1==============Open File, Read into List, Print Contents")
with codecs.open("studentinfo.txt",encoding='utf-8') as f:
  studentlist=list(csv.reader(f))

  print(studentlist)

答案 2 :(得分:-1)

使用过滤器可能有所帮助:

with open('studentinfo.txt', 'rU') as f:
    filtered = (line.replace('\r', '') for line in f)
    for row in csv.reader(filtered):
        print(row)

答案 3 :(得分:-1)

将字符串粘贴到文本编辑器中并保存文件不会在不同平台上生成字节相同的文件。 (即使同一平台上的不同编辑也不一致!)

但是,csv模块接受的CSV格式是以字节精确表示的形式指定的。可以使用方言(内置方言或实现新方言)自定义行为 - 有关详细信息,请参阅Python documentation。默认方言是excel,需要Windows样式的行结尾(CR / LF)。如果以不同的格式保存文件,则无法正确解析。