文本从第n个位置开始时如何仅读取文本文件中的行

时间:2019-01-09 21:09:57

标签: python-2.7

我有一个需要解析的配置文本文件。看起来像这样:

FROM amazonlinux
COPY . /app
RUN yum -y update
RUN yum -y install python3
RUN yum -y install python3-pip
RUN yum install python-devel -y
RUN yum install gcc gcc-devel -y
RUN yum install libxml2 libxml2-devel -y
RUN yum install libxslt libxslt-devel -y
RUN yum install openssl openssl-devel -y
RUN yum install libffi libffi-devel -y
RUN pip3 install lxml
RUN pip3 install scrapy
RUN pip3 install -r /app/requirements.txt
WORKDIR /app
ENTRYPOINT ["python3", "/app/spiders/start.py"]

我想仅根据服务器池类型来构建列表, ['agateway','ac-edge','webnode']。 考虑只将开始于4个空格的行放入缓存,然后解析出冒号。 关于实现此目标的最佳Pythonic方式有何想法?

2 个答案:

答案 0 :(得分:1)

您可以使用正则表达式来解析所需的数据:

import re

with open('file', 'r') as file_:
    data = re.findall(r'\s+(.+):$', file_.read(), re.MULTILINE)
print data

答案 1 :(得分:0)

我不确定只读取以四个空格开头的行,但是一种方法可能是读取整个内容,然后只选择以冒号结尾的行,然后在走时取下冒号。这可能是更多的Python 3语法,因为这是我惯用的语法,但是列表理解应该与以下两种方法几乎相同:

data = []
with open('my_file', 'r') as a_file:
    for line in a_file:
        data.append(line.strip())  # all lines, minus white space
data = [d[:-1] for d in data if d[-1] == ':']
print(data)
# ['agateway', 'ac-edge', 'webnode']

因此,基本上,将您的文件逐行读取到一个列表中,然后使用列表推导仅获取您关心的内容。您可以通过仅在列表中添加以冒号结尾的行来完成类似的操作:

data = []
with open('my_file', 'r') as a_file:
    for line in a_file:
        if line.strip()[-1] == ':':
            data.append(line.strip())
print(data)
# ['agateway', 'ac-edge', 'webnode']