Python阅读文件和跳过无效的行

时间:2015-07-20 23:44:13

标签: python python-2.7 csv

我一直在尝试编写一些代码来读取CSV文件。 CSV中的某些行不完整。如果其中一个字段中缺少数据,我希望代码跳过坏行。我使用以下代码。

def Test():

    dataFile = open('test.txt','r')
    readFile = dataFile.read()
    lineSplit = readFile.split('\n')

    for everyLine in lineSplit:
        dividedLine = everyLine.split(';')
        a = dividedLine[0]
        b = dividedLine[1]
        c = dividedLine[2]
        d = dividedLine[3]
        e = dividedLine[4]
        f = dividedLine[5]
        g = dividedLine[6]

        print (a,b,c,d,e,f,g)

3 个答案:

答案 0 :(得分:2)

在我看来, Pythonic 这样做的方法是将包含的csv模块与try/except块结合使用(同时关注PEP 8 - Style Guide for Python Code )。

import csv

def test():
    with open('reading_test.txt','rb') as data_file:
        for line in csv.reader(data_file):
            try:
                a,b,c,d,e,f,g = line
            except ValueError:
                continue  # ignore the line
            print(a,b,c,d,e,f,g)

test()

这种方法被称为“比宽容更容易获得宽恕”(EAFP)。另一种更常见的风格被称为“在你跳跃之前看”(LBYL)。您可以从一位非常权威的作者的书中了解this snippet中有关它们的更多信息。

答案 1 :(得分:0)

鉴于你不能事先知道给定的行是否不完整,你需要检查它是否是,如果不是,则跳过它。您可以使用continue,这会使for循环移至下一次迭代:

def Test():

    dataFile = open('test.txt','r')
    readFile = dataFile.read()
    lineSplit = readFile.split('\n')

    for everyLine in lineSplit:
        dividedLine = everyLine.split(';')

        if len(dividedLine) != 7:
            continue

        a = dividedLine[0]
        b = dividedLine[1]
        c = dividedLine[2]
        d = dividedLine[3]
        e = dividedLine[4]
        f = dividedLine[5]
        g = dividedLine[6]

        print (a,b,c,d,e,f,g)

答案 2 :(得分:0)

这似乎并非全部 - 与概念相关的python:如果符合以下情况,从csv行解析的行将无效: 1.它比最小要求长度短(即缺少元素) 2.解析的一个或多个条目返回空或无(仅当需要所有元素时) 3.元素的类型与列的预期类型不匹配(不在您请求的范围内,但要记住要好)

在python中,一旦拆分数组,就可以用

检查前两个条件
if len(dividedLines) < intended_length or ("" in dividedLines): continue

第一部分只需要你获得一行的预期长度,你通常可以使用索引行。第二部分可以用无或者替换引号,但split返回一个空字符串,所以在这种情况下使用“”。

HTH