【问题标题】:additional list added after each row python每行python之后添加的附加列表
【发布时间】:2017-07-21 05:41:59
【问题描述】:

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 之间保持一致性的学生来说,这是一个巨大的问题,这是他们在学校和家庭环境之间所做的工作。

任何显示代码允许它在两者上工作的答案都是我所追求的。

【问题讨论】:

  • 有人吗?有人吗?
  • 您需要显示“原样”文件的实际字节数。我相信 csv 模块解析的 CSV 格式需要 CRLF 行结尾,无论平台如何。
  • 您能否发布一个解决方案 - 我不知道这意味着什么!谢谢
  • @pythoncarrot:那条评论是针对我的吗?我的“解决方案”是问题中的代码实际上是正确的。相反,文件中的字节是错误的。 (或者至少对于 excel 方言是错误的,这是 csv 模块的默认设置。)
  • 谢谢 - 你能进一步解释一下吗?如果是文件中的字节错误,这是什么意思,如何纠正?

标签: python csv newline


【解决方案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))

这将产生,s 的列表,但穿插有13,1010,但也可能是10,13,10。这些是讨论过的\r\n\n,但是我想知道您是否设法以某种方式获得了第三个选项? 如果是这样,我认为您需要重写该文本文件以获得正常的行尾。

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

实际问题来自于在两个应用程序中编辑文件,每个应用程序对行尾的含义都有不同的解释(Windows 应用程序应该是 \r\n,“repl.it”是 \n。我已经以前遇到过,但从未制定出所需的操作顺序。

【讨论】:

  • 非常感谢格伦!第一个也是最简单的建议(我认为)有效……但实际上它在列表之间产生了 7。更神秘! [['001', 'Joe', 'Bloggs', 'Test1:99', 'Test2:100', 'Test3:1'], ['7'], ['002', 'Ash', 'Smith ', 'Test1:20', 'Test2:20', 'Test3:100']]
  • 你的第二个代码产生这个:,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, ,,,,,10,13,10,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, , >>>
  • 我可以看到 7 基本上是第一行的最后一个字符(它添加到它自己的其他行之间的列表中。所以文本文件包含:001,Joe,Bloggs,Test1:99 ,Test2:100,Test3:17 002,Ash,Smith,Test1:20,Test2:20,Test3:100 但由于某种原因它被格式化(不可见)为 001,Joe,Bloggs,Test1:99,Test2:100, Test3:1 7 002,Ash,Smith,Test1:20,Test2:20,Test3:100
  • 完全奇怪。我只是用相同的输入重新编写了文本文件:001,Joe,Bloggs,Test1:99,Test2:100,Test3:9 002,Ash,Smith,Test1:20,Test2:20,Test3:100 和第一个原始代码工作正常!我会接受你的回答,因为它提供了最深刻的见解,谢谢。想知道您是否可以阐明如何格式化文本文件并确保它们不包含不可见的错误额外行
【解决方案2】:

尝试使用编解码器并明确指定文件的编码为 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)

【讨论】:

  • 试过了 - 谢谢 - 但不幸的是产生了相同的结果
【解决方案3】:

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

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

【讨论】:

  • 这有助于了解(过滤器)...但仍然不起作用
  • 这是错误的:您不需要为文件的每一行实例化一个新的csv.reader 对象!
  • 有人建议是“文件中的字节错误”。这到底是什么意思,更重要的是,如何解决!
【解决方案4】:

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

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

【讨论】:

  • 我不希望对此投反对票...但是如果没有粘贴问题的简单解决方案和有效的代码,这根本没有帮助
  • 我同意 OP - 有关详细信息,请参阅 Python 文档没有帮助!你可能是对的,但你能发布一个可以使用的解决方案吗?
  • @MissComputing:我不会为你编写代码。我在回答你的问题。我已经觉得我已经向后弯腰来帮助你了。请记住,我是出于好心,在我自己的时间帮助你。
  • 如前所述,我很欣赏这个姿态,但您的解决方案/建议是无法验证的。不过谢谢!我会等待任何其他答案。
  • 恐怕您的解决方案不提供知识。请参阅其他答案及其清晰度/可验证性。其他人会同意这个问题是具体的,展示了研究,而不是简单地问“写我的代码”。
猜你喜欢
  • 2015-11-10
  • 1970-01-01
  • 2019-01-08
  • 1970-01-01
  • 2014-06-01
  • 2012-12-20
  • 1970-01-01
  • 2022-11-22
  • 2017-04-16
相关资源
最近更新 更多