打开,读取,然后将行存储到Python中的列表中

时间:2016-04-08 03:02:13

标签: python list file python-3.x

所以我看过这段代码;

with open(fname) as f:
    content = f.readlines()

在另一个问题中。我只需要确认它是如何工作的。 如果我有一个名为normaltrack.py的文件,其中包含代码;

wall 0 50 250 10
wall 0 -60 250 10
finish 200 -50 50 100

我应该有一个名为wall = []的列表,其开头代码为;

with open(normaltrack.py) as f:
    wall = f.readlines()

打开文件并存储以" wall"开头的代码行。进入名单?

我是否经常更改" fname"每次我想打开一个不同的文件?或者有没有办法从翻译中做到这一点?例如python3 assignment.py< normaltrack.py?

3 个答案:

答案 0 :(得分:1)

在你的例子中:

with open(fname) as f:
    content = f.readlines()

'fname'是对字符串的变量引用。此字符串是文件路径(相对或绝对)。

要阅读您的示例文件,并生成包含'wall'的所有行的列表,您可以执行以下操作:

fname = '/path/to/normaltrack-example.txt'  # this would be an absolute file path in Linux/Unix/Mac
wall = []
with open(fname) as the_file:
    for line in the_file:
        if line.startswith('wall'):
            wall.append(line) # or wall.append(line.rstrip()) to remove the line return character

通常,除非您控制文件(也就是说,它不是用户提供的内容),否则最好不要在文件对象上调用'readlines()'。这是因为readlines会将整个文件读入内存,当文件为多GB时,这会很糟糕。

答案 1 :(得分:0)

这是一个快速而又脏的脚本,可以满足您的需求。

import sys

if len(sys.argv) > 1:
    infile = sys.argv[1]
else:
    print("Usage: {} <infile>".format(sys.argv[0]))
    sys.exit(1)

with open(infile, 'r') as f:
    walls = []
    for line in f:
        if line.startswith('wall'):
            walls.append(line.strip())

如果您将此脚本命名为“read_walls.py&#39;”,则可以从命令行运行,如下所示

python read_walls.py normaltrack.py

通常,我使用argparse来解析命令行参数,并为代码编写main()函数。 (这使得它在交互式python解释器中可以测试。)

答案 2 :(得分:0)

此代码应该适合您

#!/usr/bin/env python
import sys

def read_file(fname):
    call = []
    with file(fname) as f:
        call = f.readlines()
    call = filter(lambda l: l.startswith('wall'), call)
    return call

if __name__ == '__main__':
    fname = sys.argv[1]
    call = read_file(fname)
    print call