簡體   English   中英

Python讀取文件並跳過無效行

[英]Python Reading File and Skipping Invalid Lines

我一直在嘗試編寫一些代碼來讀取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)

我認為, Pythonic的方法是將包含的csv模塊與try/except塊結合使用(在遵循PEP 8-Python代碼樣式指南的同時)。

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)。 您可以在此摘錄中閱讀非常權威的作者的書,以獲取更多有關它們的信息。

鑒於您無法事先知道給定的行是否不完整,因此需要檢查它是否是不完整的。 您可以為此使用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)

這似乎並不全是python在概念上的相關性:從csv行解析的行在以下情況下將是無效的:1.比最短要求的長度短(即缺少元素)2.解析了一個或多個條目返回空值或無(僅在需要所有元素的情況下)3.元素的類型與列的預期類型不匹配(不在您請求的范圍內,但請記住)

在python中,分割數組后,您可以使用以下命令檢查前兩個條件

if len(dividedLines) < intended_length or ("" in dividedLines): continue

第一部分僅需要您獲取行的預期長度,通常可以使用索引行。 第二部分可以將引號替換為None或其他內容,但是split返回一個空字符串,因此在這種情況下使用“”。

高溫超導

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM