2014-03-04 23 views
1

我有一个readline()方法的问题,它有时会返回2行而不是一个,我不知道为什么。有人能帮我吗 ?错误的readline()在Python

这里文本文件我看过(用记事本)的一部分:

at+gpsinit=2 
OK 

+GPSEVINIT: 1 
at+gpsnmea=3 
OK 
at+gpsstart=0 
OK 

并用记事本++:

at+gpsinit=2CR 
CR LF 
OKCR LF 
CR LF 
+GPSEVINIT: 1CR LF 
at+gpsnmea=3CR 
CR LF 
OKCR LF 
at+gpsstart=0CR 
CR LF 
OKCR LF 

这里是我在Python外壳有:

16 : at+gpsinit=2 

17 : 

18 : OK 

19 : 

20 : +GPSEVINIT: 1 

21 : at+gpsnmea=3 

这里我的代码:

# Open a file 
file = open("testtxt.txt", 'r') 
line = 0 

for current_line in file: 
    line += 1  
    print(str(line)+" : "+current_line) 

# Close opend file 
file.close() 
+2

恩,对我来说很好。 –

+0

请注意,“at + gpsinit = 2”和“OK”之间没有行跳,所以我不明白为什么会有17个“空白”行。 – katze

+1

emty线也是线。 –

回答

0

好吧,所以我解决了我的问题,似乎Np给我错误的文本文件。无论如何,我用这个命令:

file = open("testtxt.txt", 'r', newline="\r\n") 

它给了我很好的线条。

1

readline()例程中肯定没有错误;太多的人经常使用它,除非你有一个非常奇怪的实现,它不是标准的Python,否则你也会使用一个体面的版本。

您提供的信息还不足以成为当然您的问题的原因是什么,但有一些分析方法,我会建议找出您正在处理的内容。

你应该仔细看看你的线路中有哪些字节终止你的线路('\n''\r\n'或其他什么),并特别仔细看看线路at+gpsinit=2及其结尾。

在Unix系统上,您可以使用od(或xxd)。使用选项-c打印字符。使用-t x1 -t c也可以为每个字节获得十六进制输出。

+0

是的,谢谢,我得出了同样的结论,我用Notepad ++而不是记事本读了文件,实际上在第16行末有一个'CR',在第17行有'CR LF ”。 – katze

2

您遇到的问题很可能是由于行尾标记存在问题。

  • 视窗/ DOS通常使用CRLF(或,\r\n,或0d0a以字节为单位)。
  • Unix的通常使用LF(或\n,或以字节0a
  • MacOS的通常使用CR(或\r,或以字节0d

下面是一些例子与ASCII编码的文件:

$ hexdump -C test_dos.txt 
00000000 68 65 6c 6c 6f 0d 0a 77 6f 72 6c 64 0d 0a  |hello..world..| 
0000000e 

$ hexdump -C test_nix.txt 
00000000 68 65 6c 6c 6f 0a 77 6f 72 6c 64 0a    |hello.world.| 
0000000c 

$ hexdump -C test_mac.txt 
00000000 68 65 6c 6c 6f 0d 77 6f 72 6c 64 0d    |hello.world.| 
0000000c 

广告你可以看到,单词hello68 65 6c 6c 6f)后面跟着不同的字节分别为,0a0d。在MS记事本中编辑文件时,最有可能会插入CRLF。由于LF在软件开发中是最常见的,Notepad ++很可能会添加这些。

现在,你的代码:鉴于以上三个文件,一个类似的代码你得到以下结果:

代码:

files = ('test_dos.txt', 'test_nix.txt', 'test_mac.txt') 

for fname in files: 
    print("Reading {}".format(fname)) 
    with open(fname) as fptr: 
     for line in fptr: 
      print("--> {!r}".format(line)) 
    print(80*"-") 

输出:

Reading test_dos.txt 
--> 'hello\r\n' 
--> 'world\r\n' 
-------------------------------------------------------------------------------- 
Reading test_nix.txt 
--> 'hello\n' 
--> 'world\n' 
-------------------------------------------------------------------------------- 
Reading test_mac.txt 
--> 'hello\rworld\r' 
-------------------------------------------------------------------------------- 

正如你可以清楚地看到,Python分裂在\n字符上,但不会将其从输出中删除。这就是为什么“mac”示例只有一行。

如果您不得不处理来自异质数据源的文件,请考虑启用U标志为open的“通用换行符”。

下面是一个例子。需要注意的是其唯一改变的事情是U参数open

files = ('test_dos.txt', 'test_nix.txt', 'test_mac.txt') 

for fname in files: 
    print("Reading {}".format(fname)) 
    with open(fname, 'U') as fptr: 
     for line in fptr: 
      print("--> {!r}".format(line)) 
    print(80*"-") 

输出:

Reading test_dos.txt 
--> 'hello\n' 
--> 'world\n' 
-------------------------------------------------------------------------------- 
Reading test_nix.txt 
--> 'hello\n' 
--> 'world\n' 
-------------------------------------------------------------------------------- 
Reading test_mac.txt 
--> 'hello\n' 
--> 'world\n' 
-------------------------------------------------------------------------------- 

正如你所看到的,并不是所有的文件的行为相同。这可能会提示您在正在阅读文本文件的任何地方胡椒粉U。不过,我确信有一个很好的理由,它不是默认的! :)