繁体   English   中英

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

[英]Open, read, then store lines into a list in Python

因此,我已经看到了这段代码;

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吗?

在您的示例中:

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时,这很烂。

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

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”,则可以从命令行这样运行它,

python read_walls.py normaltrack.py

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

该代码应该为您工作

#!/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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM