2

我有一个 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
4

3 回答 3

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
于 2013-05-23T06:37:48.173 回答
1

这是您的代码的简化版本,它更容易理解您正在尝试做的事情,并且更加 Pythonic。

首先打开和读取您的文件,我们使用该with语句自动关闭文件,并构建一个生成器来循环您的 CSV 文件,仅获取包含至少一个非空白列值的行并将每个元素转换为浮点数 (通过辅助函数)如果可能,否则将其保留为字符串。然后构建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

从外观上看,您可能希望考虑numpypandas在处理此类数据时。

于 2013-05-23T07:24:34.097 回答
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']]

实际上,使用 condition if any(field.strip() for field in row),您也将没有字符的行视为空行。

于 2013-05-23T07:33:19.753 回答