我很难理解为什么我的python程序在从文件中读取(首先)行并将这些行添加到列表中时所做的事情。由于某些原因,第一行需要为空,否则它将无法正确读取第一行。如果第一行是空的,那么它就不是空的(至少根据python不是)。问题是,我有两种类型的文件:
第一个文件的格式如下:
text:more text
another text:and more以及表格中的第二个文件:
text_file.txt
anothertext_file.txt这两个文件都是UTF-8编码的文本文件.在我的程序中添加到列表中的两个文件的第一行是"text“和"text_file.txt”,但是任何代码,例如,试图说
if something == "text":
...即使“某事”与“文本”相同,也不会被执行。
所以我假设我的问题是,在机器代码(或其他什么)的某个地方,我的计算机在文本文件的开头写一些不可见的代码,这使得第一行不再是原来的样子。也许吧?实际上,我已经找到了解决这个问题的方法,只需在逐行读取文件时添加一个空行和一个if子句:
if not "." in line:
...在另一种文件类型中:
if not ":" in line:
...那些if子句起作用,我的程序做它应该做的事情(只要我总是在文件的开头添加一个空行),但是我还没有找到一个真正的理由来解释为什么我的程序是这样的。此外,如果有一个更简单的解决方案,而不需要编辑所有文件并向代码中添加一个if子句,我也不想做这种解决方案。
希望你能帮助我理解这里发生的一切!
编辑:正如你们一直要求我的代码,这是:
filelist = []
with open("filename.txt", "r", encoding="UTF-8") as f:
for line in f:
filelist.append(line.rstrip("\n"))这不能正常工作。我也试过了就像mxds说的,
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,还是应该只在创建文件时这样做呢?
发布于 2016-06-18 08:08:34
看起来您已经在这方面做了一些工作,但是根据How to make Notepad to save text in UTF-8 without BOM?的说法,最好的答案是不要使用记事本(但是Notepad++是可以的)。:)
或者,您也可以使用以下方法进行strip the BOM in Python:
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 (类似于字节序列:0xef、0xbb、0xbf)。 ..。 在解码时,如果这三个字节作为文件中的前三个字节出现,utf-8-sig将跳过它们。在UTF-8中,不鼓励使用BOM,一般应该避免使用BOM。
发布于 2016-06-17 21:46:43
在Python中读取文本文件的一种经典方法是:
with open(fname, 'r') as f:
lines = f.readlines()在此之后,您可以像这样处理行:
for line in lines:
# do something with line...正如其他评论所暗示的那样,您可能希望首先确保此操作有效。如果您将当前代码发布以供审阅,则会有所帮助。
发布于 2022-05-13 15:52:23
我只是遇到了类似的问题: python报告了第一行标题无效的字符,类似于readlines() ?。我已经尝试了所有的建议,我可以谷歌,没有运气。
我想出了一个简单的技巧:跳过这一行
添加一个空行作为文本文件中的第一行。
if len(line[i]) > len(line[0]):
do things
else:
skipping在我的例子中,len(line[0] = 4,所有其他行都大于4
https://stackoverflow.com/questions/37890696
复制相似问题