首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Python -无法将文本文件的第一行正确地读取到列表中

Python -无法将文本文件的第一行正确地读取到列表中
EN

Stack Overflow用户
提问于 2016-06-17 21:35:21
回答 3查看 1.7K关注 0票数 1

我很难理解为什么我的python程序在从文件中读取(首先)行并将这些行添加到列表中时所做的事情。由于某些原因,第一行需要为空,否则它将无法正确读取第一行。如果第一行是空的,那么它就不是空的(至少根据python不是)。问题是,我有两种类型的文件:

第一个文件的格式如下:

代码语言:javascript
复制
text:more text
another text:and more

以及表格中的第二个文件:

代码语言:javascript
复制
text_file.txt
anothertext_file.txt

这两个文件都是UTF-8编码的文本文件.在我的程序中添加到列表中的两个文件的第一行是"text“和"text_file.txt”,但是任何代码,例如,试图说

代码语言:javascript
复制
if something == "text":
    ...

即使“某事”与“文本”相同,也不会被执行。

所以我假设我的问题是,在机器代码(或其他什么)的某个地方,我的计算机在文本文件的开头写一些不可见的代码,这使得第一行不再是原来的样子。也许吧?实际上,我已经找到了解决这个问题的方法,只需在逐行读取文件时添加一个空行和一个if子句:

代码语言:javascript
复制
if not "." in line:
    ...

在另一种文件类型中:

代码语言:javascript
复制
if not ":" in line:
    ...

那些if子句起作用,我的程序做它应该做的事情(只要我总是在文件的开头添加一个空行),但是我还没有找到一个真正的理由来解释为什么我的程序是这样的。此外,如果有一个更简单的解决方案,而不需要编辑所有文件并向代码中添加一个if子句,我也不想做这种解决方案。

希望你能帮助我理解这里发生的一切!

编辑:正如你们一直要求我的代码,这是:

代码语言:javascript
复制
filelist = []
with open("filename.txt", "r", encoding="UTF-8") as f:
for line in f:
    filelist.append(line.rstrip("\n"))

这不能正常工作。我也试过了就像mxds说的,

代码语言:javascript
复制
filelist = []
with open("filename.txt", "r", encoding="UTF-8") as f:
lines = f.readlines()
for line in lines:
    filelist.append(line.rstrip("\n"))

这也不起作用。这只是第一行第一个字符中的文件中的一个问题。

Edit2:问题似乎是在我的文本文件开头有一个Byte顺序标记。经过快速搜索,我没有找到一个解决方案,我可以删除它。我在用windows记事本创建文件。

最终编辑:显然记事本不是真正的文本编辑器。我想我会把记事本换成notepad++来避免这个问题。但是,为了防止我不得不在记事本中处理我的文件:如果我在记事本中打开一个文本文件并在其中添加一些文本,它会添加一个BOM,还是应该只在创建文件时这样做呢?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-06-18 08:08:34

看起来您已经在这方面做了一些工作,但是根据How to make Notepad to save text in UTF-8 without BOM?的说法,最好的答案是不要使用记事本(但是Notepad++是可以的)。:)

或者,您也可以使用以下方法进行strip the BOM in Python

代码语言:javascript
复制
line = line.decode("utf-8-sig").encode("utf-8")

请参阅https://docs.python.org/3/library/codecs.html

为了提高检测UTF-8编码的可靠性,微软为其记事本程序发明了UTF-8 (Python2.5调用"utf-8-sig")的变体:在将任何Unicode字符写入文件之前,编写一个UTF-8编码的BOM (类似于字节序列:0xef0xbb0xbf)。 ..。 在解码时,如果这三个字节作为文件中的前三个字节出现,utf-8-sig将跳过它们。在UTF-8中,不鼓励使用BOM,一般应该避免使用BOM。

票数 1
EN

Stack Overflow用户

发布于 2016-06-17 21:46:43

在Python中读取文本文件的一种经典方法是:

代码语言:javascript
复制
with open(fname, 'r') as f:
    lines = f.readlines()

在此之后,您可以像这样处理行:

代码语言:javascript
复制
for line in lines:
    # do something with line...

正如其他评论所暗示的那样,您可能希望首先确保此操作有效。如果您将当前代码发布以供审阅,则会有所帮助。

票数 0
EN

Stack Overflow用户

发布于 2022-05-13 15:52:23

我只是遇到了类似的问题: python报告了第一行标题无效的字符,类似于readlines() 。我已经尝试了所有的建议,我可以谷歌,没有运气。

我想出了一个简单的技巧:跳过这一行

添加一个空行作为文本文件中的第一行。

代码语言:javascript
复制
if len(line[i]) > len(line[0]):
   do things
else: 
   skipping

在我的例子中,len(line[0] = 4,所有其他行都大于4

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37890696

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档