我一直在尝试编写一些代码来读取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)
答案 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