2013-05-03 26 views
0

检查,以确保的Python:检查制表符分隔的文件中列的适当数量

一)每行4列长

二)确保它不会失败,如果那里有一个新的('\ 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 
+1

它会给你什么错误吗?你会得到什么?你想检查'如果lineLength <2和我 Moj 2013-05-03 18:09:16

+1

我想你应该检查'lineLength!= 4' – Moj 2013-05-03 18:13:36

+1

我们能得到约5行样本数据作为预期的输入? – Droogans 2013-05-03 18:16:00

回答

0
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) 
1

您抱怨说您的代码“不会以任何方式影响程序的其余部分”。

由于相关代码中没有任何内容修改任何数据或更改任何控制流,当然它不会影响程序的其余部分。因此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 

同时,您的代码还有其他一些问题。

with区块中使用f后,您不应该致电f.close()。通常你会很幸运并且是无害的,但是“通常无害并且没有帮助”并不是你想要的那种代码。

如果要计算某些东西中的所有行,请不要将明确的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 

同时,你真的想打印出一个警告,每无效行,如果有可能,比方说,他们10万?如果没有,你可以做得更简单:

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)] 
+0

@AlButter:如果你确定这就是你想做的事情(尽早退出,返回代码是一个奇怪的方式来表示错误......),你应该能够找出如何用' sys.exit',或其他任何你想要的。 – abarnert 2013-05-03 19:06:06

相关问题