Python无法正确读取行

时间:2014-08-19 15:54:34

标签: python macos

我应该打开一个文件,每行读取一行并显示行。

以下是代码:

#!/usr/bin/env python
# -*- coding: utf-8 -*- 
import os
import re

in_path = "../vas_output/Glyph/20140623-FLYOUT_mins_cleaned.csv"
out_path = "../vas_gender/Glyph/"

csv_read_line = open(in_path, "rb").read().split("\n")
line_number = 0
for line in csv_read_line:
    line_number+=1
    print str(line_number) + line

这里是输入文件的内容:

12345^67890^abcedefg 
random^test^subject
this^sucks^crap

结果如下:

this^sucks^crapjectfg

三者中有些奇怪的组合。除此之外,line_number的结果缺失。无论输入文件中有多少,出于某种原因打印出len(csv_read_line)输出1的结果。但是,将分割类型从\n更改为^可以得到预期的输出,因此我假设问题可能与输入文件有关。

我正在使用Mac,并在Mac上同时执行python代码和输入文件(在Sublime Text上)。

enter image description here

我错过了什么吗?

4 个答案:

答案 0 :(得分:1)

您似乎在"\n"上拆分,这是不必要的,并且可能不正确,具体取决于输入文件中使用的行终止符。 Python包含一次迭代一个文件行的功能。优点是它会以可移植的方式担心处理行终止符,并且不需要将整个文件同时保存在内存中。

此外,请注意,当您实际打算将文件作为文本读取时,您将以二进制模式(模式字符串中的b字符)打开文件。这可能会导致类似于您遇到的问题。

此外,完成后不要关闭文件。在这种情况下,这不是问题,但您应该养成尽可能使用with块的习惯,以确保文件尽早关闭。

试试这个:

with open(in_path, "r") as f:
    line_number = 0
    for line in f:
        line_number += 1
        print str(line_number) + line.rstrip('\r\n')

答案 1 :(得分:0)

所以你的例子对我有用。

但是,我只是将你的文本复制到linux上的文本编辑器中,然后就这样做了,所以任何回车都会被删除。

尝试使用此代码:

import os

in_path = "input.txt"

with open(in_path, "rb") as inputFile:
  for lineNumber, line in enumerate(inputFile):

    print lineNumber, line.strip()

它更干净一点,for line in file样式以独立于系统的方式处理换行符 - Python open具有通用换行符支持。

答案 2 :(得分:-1)

我尝试使用以下Pythonic代码:

#!/usr/bin/env python

in_path = "../vas_output/Glyph/20140623-FLYOUT_mins_cleaned.csv"
out_path = "../vas_gender/Glyph/"

with open(in_path, 'rb') as f:
    for i, line in enumerate(f):
        print(str(i) + line)

答案 3 :(得分:-1)

这里可以进行一些改进,使其成为更具惯用性的python。

import csv

in_path = "../vas_output/Glyph/20140623-FLYOUT_mins_cleaned.csv"
out_path = "../vas_gender/Glyph/"

#Lets open the file and make sure that it closes when we unindent
with open(in_path,"rb") as input_file:

    #Create a csv reader object that will parse the input for us
    reader = csv.reader(input_file,delimiter="^")

    #Enumerate over the rows (these will be lists of strings) and keep track of
    #of the line number using python's built in enumerate function
    for line_num, row in enumerate(reader):
        #You can process whatever you would like here.  But for now we will just
        #print out what you were originally printing
        print str(line_num) + "^".join(row)