Python 3.x Python CSV阅读器检查完整数据
我正在尝试创建一个CSV阅读器,它只包含所有第6、7和8列的读数 我的数据是一年中几天的降雨量。但我的代码有一个例外,一些数据是在几天内记录的。记录数据的天数在第[6]行中显示,前几天在第6、7和8列中保留空白,即使它们是完整的 因此,对于读卡器,我需要制作一个计数器,首先检查数据是否完整(无空格),或者它是否有空格,是否是另一个读数的一部分(记录几天)或不完整(无读数),我迄今为止所做的如下所示:Python 3.x Python CSV阅读器检查完整数据,python-3.x,csv,Python 3.x,Csv,我正在尝试创建一个CSV阅读器,它只包含所有第6、7和8列的读数 我的数据是一年中几天的降雨量。但我的代码有一个例外,一些数据是在几天内记录的。记录数据的天数在第[6]行中显示,前几天在第6、7和8列中保留空白,即使它们是完整的 因此,对于读卡器,我需要制作一个计数器,首先检查数据是否完整(无空格),或者它是否有空格,是否是另一个读数的一部分(记录几天)或不完整(无读数),我迄今为止所做的如下所示: datalist = [] def read_complete_data(): '''
datalist = []
def read_complete_data():
''' Reads the file'''
filename = input("Enter file name:") #File must be in the same folder as the directory
with open(filename, 'r') as fileobj:
#open file for reading
reader = csv.reader(fileobj, delimiter = ',')
next(reader)
tempList = []
for row in reader:
if row[5] == "" and row[6] == "" and row[7] == "" :
tempList.append(row)
#Checks if the row is complete
elif row[5] != "" and row[6] != "" and row[7] != "":
numDay = int(row[6])
while numDay > 1:
datalist.append(tempList[1-numDay])
numDay -= 1
数据示例:
Product code, Station number, Year, Month, Day, Rainfall, Period, Quality
IDCJAC0009, 70247, 1988, 12, 21, 0, , Y
IDCJAC0009, 70247, 1988, 12, 22, 0, , N
IDCJAC0009, 70247, 1988, 12, 23, 0.2, 1, Y
IDCJAC0009, 70247, 1988, 12, 24, 0.4, 1, Y
IDCJAC0009, 70247, 1988, 12, 25, , Y
IDCJAC0009, 70247, 1988, 12, 26, 34.8, 2, Y
IDCJAC0009, 70247, 1988, 12, 27, 30.8, 1, N
产品代码、站号、年、月、日、降雨量、周期、质量
IDCJAC0009、70247、1988、12、21、0、Y
IDCJAC0009、70247、1988、12、22、0、N
IDCJAC0009、70247、1988、12、23、0.2、1、Y
IDCJAC0009、70247、1988、12、24、0.4、1、Y
IDCJAC0009、70247、1988、12、25、Y
IDCJAC0009、70247、1988、12、26、34.8、2、Y
IDCJAC0009、70247、1988、12、27、30.8、1、N
如上所述,前两个数据样本是不完整的,因为没有测量它们的周期。可以看出,第5行的数据样本是不完整的,但是以下样本的测量周期为2,这意味着第5行实际上是完整的,它只是在2天的时间跨度内测量的,而不是一天。这是一个2天测量的示例,但也有更大的示例,其中最多5天被分组为一个测量。最后一列是数据的质量以及是否是质量检查。它需要是Y才能成为完整的数据。正如我添加的,第1行和第2行仍然不完整。然而,第7行现在不完整
输出:基本上我试图实现的是要读取的CSV文件和要从数据列表中删除的不完整数据行。使用这个临时列表,我试图使datalist只包含完整的数据集
想要的输出:
Product code, Station number, Year, Month, Day, Rainfall, Period, Quality
IDCJAC0009, 70247, 1988, 12, 23, 0.2, 1, Y
IDCJAC0009, 70247, 1988, 12, 24, 0.4, 1, Y
IDCJAC0009, 70247, 1988, 12, 25, , Y
IDCJAC0009, 70247, 1988, 12, 26, 34.8, 2, Y
产品代码、站号、年、月、日、降雨量、周期、质量
IDCJAC0009、70247、1988、12、23、0.2、1、Y
IDCJAC0009、70247、1988、12、24、0.4、1、Y
IDCJAC0009、70247、1988、12、25、Y
IDCJAC0009、70247、1988、12、26、34.8、2、Y
使用下一行(读卡器),因为数据的顶行包含标题而不是实际数据。我想问题是我如何使用临时列表编写下面的for循环和while循环,然后将其复制回主列表(称为datalist)。我可能缺少一行代码,这是它工作所必需的
我知道这可能是一个非常令人困惑的问题,可能很难回答,因为这里没有提供数据,但是非常感谢您对我的代码和读取CSV文件中可能出现的错误提供任何帮助。我想我会在这里提出这个问题,尽管解释起来很混乱。
感谢CSV阅读器是Python中的生成器,这意味着它们不会提前读取超过要求的内容,这是非常有效的,因为不需要先将整个CSV存储在内存中 保留生成器语义并编写一个小的过滤函数来包装CSV阅读器并动态更改其输出是有意义的 这些要求是:
filter\u data
是一个生成器函数(生成器使用yield
而不是return
),它对需求1有一点缓冲,并且根本不会为需求2生成任何内容
用法如下:
filename = input("Enter file name:")
for row in filter_rainfall_data(filename):
print(row)
它用你的样本输入为我打印了这个
['Productcode', 'Stationnumber', 'Year', 'Month', 'Day', 'Rainfall', 'Period', 'Quality']
['IDCJAC0009', '70247', '1988', '12', '23', '0.2', '1', 'Y']
['IDCJAC0009', '70247', '1988', '12', '24', '0.4', '1', 'Y']
['IDCJAC0009', '70247', '1988', '12', '25', '', '', 'Y']
['IDCJAC0009', '70247', '1988', '12', '26', '34.8', '2', 'Y']
['IDCJAC0009', '70247', '1988', '12', '27', '30.8', '1', 'N']
如果需要,您可以使用CSV编写器将其转换为新的CSV文件
注:
buffer[-days-1:][/code>是缓冲区中最后N行的一个片段。当期间
为5天时,缓冲区[-days-1:]
将获取最后4个缓冲行
days=int(行[6])
将在非数字值上失败
- Python3.3中引入了来自
的收益。看
编码
参数newline='
。看您的问题将从您想要生成的输入和匹配输出的代表性示例中受益匪浅。有一个英文的描述很好,但实际上看到它更好。谢谢你的示例,但是没有一行有8列。代码显示输入是逗号分隔的,但示例不是。您要查看的输入输出也丢失。很抱歉,我取出了与我试图查找的部分不相关的行。它们包括产品代码和站号。我将添加最后一列,其中我忘记了我的BAD。我可以添加前两列,如果它更容易理解的话。请显示实际数据。。。否则,“
分隔符=”,“
显然是不正确的。。。逗号在哪里?这太完美了!我可能会做一些小调整,但这就是我想要的!非常感谢你!它紧跟着代码背后的理念,只需对缩进进行一些更改,就可以让代码正常工作。你做的一切都是对的,只是时间有点错。
['Productcode', 'Stationnumber', 'Year', 'Month', 'Day', 'Rainfall', 'Period', 'Quality']
['IDCJAC0009', '70247', '1988', '12', '23', '0.2', '1', 'Y']
['IDCJAC0009', '70247', '1988', '12', '24', '0.4', '1', 'Y']
['IDCJAC0009', '70247', '1988', '12', '25', '', '', 'Y']
['IDCJAC0009', '70247', '1988', '12', '26', '34.8', '2', 'Y']
['IDCJAC0009', '70247', '1988', '12', '27', '30.8', '1', 'N']