![](/img/trans.png)
[英]reading from a file and writing to a file skipping certain lines in 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.