我有一个csv文件,我逐行放入一个空列表,所以最终结果是一个嵌套列表,列表中的每一行,例如:
[[1.1,2.6,3,0,4.8],[3.5,7.0,8.0]....and so on.....].
问题出现在文件的末尾是空字符串,最终列在最终列表中:
[[1.1,2.6,3,0,4.8],[3.5,7.0,8.0],['','','','','','','','','']]
如何摆脱这些或阻止它们被附加到列表中。它们是相当大的csv文件,所以我宁愿阻止它们被附加到初始列表中。当我可能不需要时,我觉得我正在构建一个超大列表,这可能会导致内存问题。 到目前为止,这是代码:
csvfile = open(file_path, 'r')
reader = csv.reader(csvfile)
data_list = []
for row in reader:
data_list.append(row)
csvfile.close()
i = 0
file_data = []
while i < len(data_list):
j = 0
while j < len(data_list[i]):
try:
data_list[i][j] = float(data_list[i][j])
except ValueError:
pass
j += 1
file_data.append(data_list[i])
i += 1
print file_data
答案 0 :(得分:2)
问题是文件末尾是空字符串
你可以决定不追加它们:
for row in reader:
if any(row): # Checks for at least one non-empty field
data_list.append(row)
以下是any()函数的工作原理:
>>> any(['132', '', '456'])
True
>>> any(['', '', ''])
False
答案 1 :(得分:1)
这是您的代码的简化版本,它更容易理解您尝试做什么,而且更像Pythonic。
首先打开并读取您的文件,我们使用with
语句,因此文件会自动关闭,并构建一个生成器来循环CSV文件,只接受包含至少一个非空列值的行如果可能,将每个元素转换为float(通过辅助函数),否则将其保留为字符串。然后在一个语句中构建data_list
,而不是附加数据......
with open(file_path) as fin:
csvin = csv.reader(fin)
rows = (map(to_float_if_possible, row) for row in csvin if any(row))
data_list = list(rows)
辅助函数定义为:
def to_float_if_possible(text):
try:
return float(text)
except ValueError as e:
return text
根据它的外观,您可能希望在处理此类数据时考虑numpy
或pandas
。
答案 2 :(得分:0)
import csv
csvfile = open('C:\\Users\\CBild\\Desktop\\test.txt', 'r')
reader = csv.reader(csvfile)
data_list = []
for row in reader:
if any(field.strip() for field in row) :
data_list.append(row)
csvfile.close()
print(data_list)
给出
>>>
[['12 2 5'], ['1 5 4']]
实际上,对于条件if any(field.strip() for field in row)
,您也将没有字符的行视为空行。