我应该打开一个文件,每行读取一行并显示行。
以下是代码:
#!/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上)。
我错过了什么吗?
答案 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)