检查以确保
a)每一行有4列长
( b)如果程序末尾有一个新行('\n'),确保它不会失败
def ask_for_filename():
filename=raw_input("Please enter file name: ")
return filename
def read_data(filename):
with open(filename) as f:
data = f.readlines()
i = 0
for line in data:
lineContains = line.split('\t')
lineLength = len(lineContains) #calculate elements
i = i+1
if lineLength < 3 and i < len(data):
print "File is invalid format."
f.close()
return data请您纠正我有问题的地方,因为这部分代码不起作用。
i = 0
for line in data:
lineContains = line.split('\t')
lineLength = len(lineContains) #calculate elements
i = i+1
if lineLength < 3 and i < len(data):
print "File is invalid format."样本文件内容:
完整文件:
AUTHOR(S) YEAR TITLE JOURNAL/CONFERENCE
Accot;Zhai 2001 Scale effects in steering law tasks Proc. ACM CHI
Acredolo 1977 Developmental Changes in the Ability to Coordinate Perspectives of a Large-Scale Space Developmental Psychology
Aginsky;Harris;Rensink;Beusmans 1997 Two strategies for learning a route in a driving simulator Journal of Environmental Psychology不完整文件(上述代码用于这类文件):
AUTHOR(S) YEAR TITLE JOURNAL/CONFERENCE
Accot;Zhai 2001 Scale effects in steering law tasks Proc. ACM CHI
Acredolo Developmental Changes in the Ability to Coordinate Perspectives of a Large-Scale Space Developmental Psychology
Aginsky;Harris;Rensink;Beusmans 1997 Two strategies for learning a route in a driving simulator Journal of Environmental Psychology
Agrawala;Beers;Frohlich;Hanrahan;McDowall;Bolas 1997 The two-user responsive workbench: Support for collaboration through individual views of a shared space Proc. ACM SIGGRAPH
Ahmadabadi;Eiji 1996 Cooperation strategy for a group of object lifting robots Proc. of IROS发布于 2013-05-03 18:57:48
您抱怨您的代码“没有以任何方式影响程序的其余部分”。
由于相关代码中没有任何内容可以修改任何数据或更改任何控制流,因此它当然不会影响程序的其余部分。因此,read_data总是返回文件中的所有行,有效或无效。
由于您没有解释您希望它如何影响程序的其余部分,所以很难向您展示如何做您想要的…但我可以教你怎么做。
例如,与其返回所有行,不如只返回有效行:
i = 0
result = []
for line in data:
lineContains = line.split('\t')
lineLength = len(lineContains) #calculate elements
i = i+1
if lineLength < 3 and i < len(data):
print "File is invalid format."
else:
result.append(line)
return result或者,引发一个例外,而不是返回任何东西:
i = 0
for line in data:
lineContains = line.split('\t')
lineLength = len(lineContains) #calculate elements
i = i+1
if lineLength < 3 and i < len(data):
raise ValueError("File is invalid format.")
return data同时,您的代码还有其他一些问题。
在f.close()块中使用f之后,不应该调用with。通常你会得到幸运,它将是无害的,但“通常无害,永远没有帮助”不是你想要的那种代码。
如果您想要计算某些内容中的所有行,不要在循环中添加显式i = i+1,只需使用enumerate即可。
而且,我也不确定i < len(data)应该做什么,因为它总是正确的。所以我就不提这个了。(这意味着我也可以把i完全排除在外,因为它是您使用它的唯一地方,…但是我会把它留在里面,这样我就可以给你看enumerate了。
几乎从来没有一个好的理由叫readlines()。一个文件已经是一个可迭代的全行,就像readlines返回的列表一样。您所做的就是强迫您的代码更慢,并占用更多的内存,通过一次读取整个文件,而不是按需读取。
因此,下面是跳过-坏行版本:
def read_data(filename):
result = []
with open(filename) as f:
for i, line in enumerate(f):
lineContains = line.split('\t')
lineLength = len(lineContains) #calculate elements
if lineLength < 3:
print "File is invalid format."
else:
result.append(line)
return result同时,如果可能有100000个无效行,那么您真的想打印出每个无效行的警告吗?如果没有,您可以简化以下操作:
def read_data(filename):
def bad_line(line):
lineContains = line.split('\t')
lineLength = len(lineContains) #calculate elements
return lineLength < 3
with open(filename) as f:
return [line for line in f if not bad_line(line)]发布于 2013-05-03 18:25:21
def is_data_valid(filename):
data = open(filename).readlines()
lines = [x.split('\t') for x in data]
no_newlines = [line for line in lines if len(line) > 1]
return all(len(line) == 4 for line in no_newlines)https://stackoverflow.com/questions/16365098
复制相似问题