2011-03-10 77 views
0

我有一个很大的麻烦,给我的文本文件,我需要解析。这是我解析它的第三次尝试(我尝试了C和PHP,它们似乎以不同的方式失败)。提取一个子字符串使python for循环中断

我有这个非常简单的代码:

import fileinput 

for line in fileinput.input(['basin_stclair.txt']): 
    print line[0:64] 

出于某种原因,第一个打印后的代码退出。

如果我打印整个行然后它永远不会停止,但行仍然组合。 (如果我只让一个迭代循环来看,我得到两个线(14个浮子)

文本文件看起来像这样(几百行像这样的,7辆彩车):

1.749766 3.735660 0.294098 310.461737 0.000000 0.231367 0.230505

当我在凯特复制整个文本它得到所有混乱和线条相结合。

文本文件是使用Windows机器上EXCELL制造。(我的工作在Linux中)。

任何想法?

+1

您可以粘贴输出以下命令:'hexdump -C basin_stclair.txt |头' – 2011-03-10 18:30:05

+0

如果你想复制每一行的前64或更少的列,你可以很容易地在vim中做到这一点。在vim中打开文件,然后按'g'' g'' |''''''''''''''''''''''''''''' (注意'^ V'表示按一个按键击打CTRL-V)现在用':tabedit'打开一个新文件,并用'p'将其粘贴。做':w filename'来保存。如果文件的最后一行至少包含64个字符,则这只会按照公布的方式工作。 – intuited 2011-03-10 18:34:26

回答

3

你的文件中的换行符存在一些问题。尝试使用Python的通用换行符支持打开文件:

for line in open('basin_stclair.txt', 'U'): 
    print line[0:64] 
+0

这个工程,谢谢!这是有道理的,字符是断线。 – OlivierLi 2011-03-10 18:35:03

+0

+1用于识别可能是什么问题。请注意,'fileinput.input'(OP正在使用而不是'open')具有相同的模式标志参数。 – phooji 2011-03-10 18:38:04

+0

@phooji:我知道这也可以用'fileinput.input()'来完成,但它看起来有点没有意义。 – 2011-03-10 18:40:44

1

你打算打印第64行吗?如果是这样,请试试这样的:

i = 0 
for line in fileinput.input(['basin_stclair.txt']): 
    print line[0:64] 
    if i > 63: 
    break 
    i = i + 1 

您是否试图打印每行的前64个字符?试试这样的:

for line in fileinput.input(['basin_stclair.txt']): 
    if len(line) > 63: 
     print line[0:64] 
+0

我正在尝试打印前64个字符。检查长度似乎并不奏效。从我收集的每一行python读取的内容基本上是由未知字符分隔的两行。 – OlivierLi 2011-03-10 18:33:16

+0

@Stranger_in_the_night:请参阅@Sven Marnach的建议。由于您正在打开一个在Windows中生成的文件,该文件使用与Linux不同的行结尾,因此您可能希望在通用换行支持中使用“打开”。 – phooji 2011-03-10 18:35:53

+0

即使行中的字符少于64个字符,打印此段'line [0:64]',甚至只是'line [:64]'都是安全的,因此不需要首先验证行长度。 – PaulMcG 2011-03-10 18:49:27