Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/290.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何有选择地将文件中的行放入列表_Python_Python 3.x_List - Fatal编程技术网

Python 如何有选择地将文件中的行放入列表

Python 如何有选择地将文件中的行放入列表,python,python-3.x,list,Python,Python 3.x,List,我正在尝试获取一个格式如下的文件: # Comments # More comments 1,foo,bar,1 1,foo,bar,2 21,foo,bar,8 end_of_file 并将其处理成如下列表: listing = [[1,'foo','bar',1], [1,'foo','bar',2], [21,'foo','bar',8]] 目前,我正在运行类似于: listing = [] with open('foo_file.cfg','r') as f: for

我正在尝试获取一个格式如下的文件:

# Comments
# More comments

1,foo,bar,1
1,foo,bar,2
21,foo,bar,8

end_of_file
并将其处理成如下列表:

listing = [[1,'foo','bar',1], [1,'foo','bar',2], [21,'foo','bar',8]]
目前,我正在运行类似于:

listing = [] 
with open('foo_file.cfg','r') as f:
    for line in f:
        if line[0].isDigit:
            listing.append(line)   #  i've also tried listing.append([line])
显然,我的结局是:

[['1,foo,bar,1'],['1,foo,bar,2'],['21,foo,bar,8']]
我知道我可以用逗号分隔行,重建一个新列表,然后将列表附加到列表中。我当然愿意这样做,如果这是正确的方式,但我认为他们可能会更干净。我知道csv模块会将整个文件读取为正确的格式,但我不确定它会如何处理选择性地删除某些数据,如注释。

这是csv模块的一种方法,它避免了明确说明某些重复任务逗号分隔符、新行等

from io import StringIO
import csv

mystr = StringIO("""1,foo,bar,1
1,foo,bar,2
21,foo,bar,8""")

res = []

# replace mystr with open('file.csv', 'r')
with mystr as f:
    reader = filter(None, csv.reader(f))  # ignore empty lines
    for line in reader:
        if line[0].isdigit():
            res.append([int(line[0]), line[1], line[2], int(line[3])])

print(res)

[[1, 'foo', 'bar', 1],
 [1, 'foo', 'bar', 2],
 [21, 'foo', 'bar', 8]]
这是csv模块的一种方式,它避免了显式地解释一些重复任务逗号分隔符、新行等

from io import StringIO
import csv

mystr = StringIO("""1,foo,bar,1
1,foo,bar,2
21,foo,bar,8""")

res = []

# replace mystr with open('file.csv', 'r')
with mystr as f:
    reader = filter(None, csv.reader(f))  # ignore empty lines
    for line in reader:
        if line[0].isdigit():
            res.append([int(line[0]), line[1], line[2], int(line[3])])

print(res)

[[1, 'foo', 'bar', 1],
 [1, 'foo', 'bar', 2],
 [21, 'foo', 'bar', 8]]

您可以在不使用任何模块的情况下以类似方式执行此操作:

lst = []
for line in f:
    if not line.startswith('#') and line:
        lst.append([int(i) if i.isdigit() else i for i in line.split(',')])

print(lst)

# [[1, 'foo', 'bar', 1], [1, 'foo', 'bar', 2], [21, 'foo', 'bar', 8]]                                                

您可以在不使用任何模块的情况下以类似方式执行此操作:

lst = []
for line in f:
    if not line.startswith('#') and line:
        lst.append([int(i) if i.isdigit() else i for i in line.split(',')])

print(lst)

# [[1, 'foo', 'bar', 1], [1, 'foo', 'bar', 2], [21, 'foo', 'bar', 8]]                                                

如果最后一行是您想要删除的唯一一行,您可以使用pandas.read\u csv,使用error\u bad\u lines=False属性或skipfooter=1

如果需要遍历文件的行并检查要导入的行,那么我只需更改附加到列表中的行


如果最后一行是您想要删除的唯一一行,您可以使用pandas.read\u csv,使用error\u bad\u lines=False属性或skipfooter=1

如果需要遍历文件的行并检查要导入的行,那么我只需更改附加到列表中的行


一种Pythonic方法是使用itertools.dropwhile忽略满足特定条件的第一行。由于csv.reader对象是迭代器,因此不再需要读取整个文件一次,然后再次在行上循环以过滤掉它们。您还可以通过检查lambda函数中notx行的验证来删除空行

import csv
from itertools import dropwhile

with open('test.csv') as f:
    reader = dropwhile(lambda x: not(x) or x[0].startswith('#'), csv.reader(f))

# print(list(reader))
# [['1', 'foo', 'bar', '1'], ['1', 'foo', 'bar', '2'], ['21', 'foo', 'bar', '8']]

一种Pythonic方法是使用itertools.dropwhile忽略满足特定条件的第一行。由于csv.reader对象是迭代器,因此不再需要读取整个文件一次,然后再次在行上循环以过滤掉它们。您还可以通过检查lambda函数中notx行的验证来删除空行

import csv
from itertools import dropwhile

with open('test.csv') as f:
    reader = dropwhile(lambda x: not(x) or x[0].startswith('#'), csv.reader(f))

# print(list(reader))
# [['1', 'foo', 'bar', '1'], ['1', 'foo', 'bar', '2'], ['21', 'foo', 'bar', '8']]

我认为listing.appendline.strip.split','会让我更接近,减去正确的数据类型…但我没有想到这一点。谢谢。我认为listing.appendline.strip.split','会让我更接近,减去正确的数据类型……但我没有想到这一点。谢谢。这看起来和我想要的一样。然而,尽管逻辑看起来很简单,但我以前从未见过append操作中的结构。我得考虑一下。谢谢。这看起来和我想要的一样。然而,尽管逻辑看起来很简单,但我以前从未见过append操作中的结构。我得考虑一下。谢谢。我喜欢这个代码的外观。虽然下面有一些更精简的选项,但我相信我更喜欢这一个,因为一旦我更好地掌握了使用过滤器,我将在将来有更多的灵活性。我喜欢这段代码的外观。虽然下面有一些更苗条的选择,但我相信我更喜欢这一个,因为一旦我更好地掌握了使用过滤器,我将在未来有更多的灵活性。哦,天哪…这看起来不错。所以NoX是忽略空白行的吗?@是的,如果逻辑不正确的话,它会掉线。所以我一直在阅读迭代工具上的文档……一些很酷的东西。我看到了DROPITH和TAUTHOST函数,但是在数据中间的注释的情况下,我有没有看到验证数据的方式?想想未来的用途。哦,天哪…看起来不错。所以NoX是忽略空白行的吗?@是的,如果逻辑不正确的话,它会掉线。所以我一直在阅读迭代工具上的文档……一些很酷的东西。我看到了DROPITH和TAUTHOST函数,但是在数据中间的注释的情况下,我有没有看到验证数据的方式?只是想想未来的用途。