首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python:检查选项卡分隔的文件是否有适当的列数

Python:检查选项卡分隔的文件是否有适当的列数
EN

Stack Overflow用户
提问于 2013-05-03 18:07:45
回答 2查看 2K关注 0票数 0

检查以确保

a)每一行有4列长

( b)如果程序末尾有一个新行('\n'),确保它不会失败

代码语言:javascript
复制
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

请您纠正我有问题的地方,因为这部分代码不起作用。

代码语言:javascript
复制
        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."

样本文件内容:

完整文件:

代码语言:javascript
复制
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

不完整文件(上述代码用于这类文件):

代码语言:javascript
复制
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
EN

回答 2

Stack Overflow用户

发布于 2013-05-03 18:57:48

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

由于相关代码中没有任何内容可以修改任何数据或更改任何控制流,因此它当然不会影响程序的其余部分。因此,read_data总是返回文件中的所有行,有效或无效。

由于您没有解释您希望它如何影响程序的其余部分,所以很难向您展示如何做您想要的…但我可以教你怎么做。

例如,与其返回所有行,不如只返回有效行:

代码语言:javascript
复制
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

或者,引发一个例外,而不是返回任何东西:

代码语言:javascript
复制
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返回的列表一样。您所做的就是强迫您的代码更慢,并占用更多的内存,通过一次读取整个文件,而不是按需读取。

因此,下面是跳过-坏行版本:

代码语言:javascript
复制
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个无效行,那么您真的想打印出每个无效行的警告吗?如果没有,您可以简化以下操作:

代码语言:javascript
复制
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)]
票数 1
EN

Stack Overflow用户

发布于 2013-05-03 18:25:21

代码语言:javascript
复制
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)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16365098

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档