【问题标题】:Open, read, then store lines into a list in Python在 Python 中打开、读取然后将行存储到列表中
【发布时间】:2016-04-08 03:02:12
【问题描述】:

所以我看过这段代码;

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

【问题讨论】:

标签: python list file python-3.x


【解决方案1】:

在你的例子中:

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

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

要读取您的示例文件,并生成包含“墙”的所有行的列表,您可以这样做:

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

【讨论】:

    【解决方案2】:

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

    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 解释器中测试。)

    【讨论】:

      【解决方案3】:

      这段代码应该适合你

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

      【讨论】:

        猜你喜欢
        • 2019-12-20
        • 1970-01-01
        • 2023-03-14
        • 1970-01-01
        • 1970-01-01
        • 2019-09-30
        • 2021-05-28
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多