通过Python从.txt文件中给出的行创建元组

通过Python从.txt文件中给出的行创建元组,python,list,re,Python,List,Re,以下是文件listing.txt中的行,其中包含多个文件的列表,每个文件一行: -rwxr-xr-x 1 jttoivon hyad-all 2356 Dec 11 11:50 add_colab_link.py -rw-r--r-- 1 jttoivon hyad-all 164519 Dec 28 17:59 basics.ipynb -rw-r--r-- 1 jttoivon hyad-all 164477 Nov 5 19:21 basics.ipynb.orig -rw-r

以下是文件
listing.txt
中的行,其中包含多个文件的列表,每个文件一行:

-rwxr-xr-x 1 jttoivon hyad-all    2356 Dec 11 11:50 add_colab_link.py
-rw-r--r-- 1 jttoivon hyad-all  164519 Dec 28 17:59 basics.ipynb
-rw-r--r-- 1 jttoivon hyad-all  164477 Nov  5 19:21 basics.ipynb.orig
-rw-r--r-- 1 jttoivon hyad-all  115587 Dec 11 11:50 bayes.ipynb
drwxr-xr-x 4 jttoivon hyad-all    4096 Nov 29 13:07 _build
-rw-r--r-- 1 jttoivon hyad-all  198820 Dec 11 11:50 clustering.ipynb
-rw-r--r-- 1 jttoivon hyad-all    6647 Dec 11 12:20 conf.py
-rw-r--r-- 1 jttoivon hyad-all   41828 Nov 28 13:26 example_figure2.png
-rw-r--r-- 1 jttoivon hyad-all  125079 Nov 28 13:26 example_figure2.xcf
-rw-r--r-- 1 jttoivon hyad-all   24139 Nov 28 12:03 example_figure.png
-rwxr-xr-x 1 jttoivon hyad-all     650 Nov 28 12:03 example_figure.py
-rw-r--r-- 1 jttoivon hyad-all   25399 Nov  2 21:25 exception_hierarchy.pdf
-rw-r--r-- 1 jttoivon hyad-all   43632 Nov  2 22:05 exception_hierarchy.png
-rw-r--r-- 1 jttoivon hyad-all   24366 Nov  2 21:26 exception_hierarchy.svg
-rw------- 1 jttoivon hyad-all   72095 Oct  3 17:36 extra.ipynb
-rw------- 1 jttoivon hyad-all 1207075 Nov 28 16:02 face.png
-rwxr--r-- 1 jttoivon hyad-all     897 Nov 12 10:59 generate_contents.py
drwx------ 8 jttoivon hyad-all    4096 Dec 27 13:55 .git
-rw-r--r-- 1 jttoivon hyad-all      19 Dec 10 10:24 .gitignore
-rw-r--r-- 1 jttoivon hyad-all  890349 Dec 11 11:50 image_processing.ipynb
-rw------- 1 jttoivon hyad-all     689 Dec 10 10:28 index.rst
-rw-r--r-- 1 jttoivon hyad-all    5254 Nov  3 18:46 inheritance_hierarchy.pdf
-rw-r--r-- 1 jttoivon hyad-all    7271 Nov  3 18:46 inheritance_hierarchy.svg
-rw-r--r-- 1 jttoivon hyad-all    4091 Dec 11 11:50 instructions.ipynb
drwx------ 2 jttoivon hyad-all    4096 Nov 30 14:13 .ipynb_checkpoints
-rw-r--r-- 1 jttoivon hyad-all   54011 Dec 11 11:50 linear_regression.ipynb
-rw------- 1 jttoivon hyad-all     620 Nov  1 11:44 Makefile
-rw-r--r-- 1 jttoivon hyad-all   52191 Dec 11 11:50 matplotlib.ipynb
-rw------- 1 jttoivon hyad-all    1920 Nov 30 11:37 notes.ipynb
-rw-r--r-- 1 jttoivon hyad-all   82564 Dec 11 11:50 numpy.ipynb
-rw-r--r-- 1 jttoivon hyad-all   10201 Nov  3 16:36 package.pdf
-rw-r--r-- 1 jttoivon hyad-all    5742 Nov  3 16:37 package.svg
-rw-r--r-- 1 jttoivon hyad-all  913641 Nov 26 10:58 painting.png
-rw-r--r-- 1 jttoivon hyad-all  348531 Dec 28 13:40 pandas.ipynb
-rw-r--r-- 1 jttoivon hyad-all  100697 Dec 11 11:50 pca.ipynb
-rw------- 1 jttoivon hyad-all   32451 Oct  5 19:21 Python-basic-elements.ipynb
-rw------- 1 jttoivon hyad-all      82 Nov 13 12:55 requirements.txt
-rw------- 1 jttoivon hyad-all      81 Nov 13 12:44 requirements.txt.old
-rw-r--r-- 1 jttoivon hyad-all    2836 Nov 12 10:58 sisallys.ipynb
-rw------- 1 jttoivon hyad-all  128194 Nov 23 12:58 testing.ipynb
-rw-r--r-- 1 jttoivon hyad-all     691 Nov 29 16:27 .travis.yml
-rw-r--r-- 1 jttoivon hyad-all     973 Oct 31 14:01 typing1.fig
-rw-r--r-- 1 jttoivon hyad-all    3747 Oct 31 14:01 typing1.svg
-rw-r--r-- 1 jttoivon hyad-all    1093 Oct 31 14:01 typing2.fig
-rw-r--r-- 1 jttoivon hyad-all    4053 Oct 31 14:02 typing2.svg
-rw-r--r-- 1 jttoivon hyad-all   12220 Oct 31 14:07 typing.svg
-rwx------ 1 jttoivon hyad-all     766 Oct 25 12:10 versions.py
每行包含特定字段:访问权限、引用数、所有者名称、拥有组的名称、文件大小、日期、文件名。这些字段通过一个或多个空格分隔;这七个字段中也可能有空格

我被要求编写函数
file\u list
,加载给定的文件,并使用一些正则表达式返回元组列表(大小、月、日、小时、分钟、文件名);我选择了
findall
方法

我编写了以下代码:

import re

def file_listing(filename="src/listing.txt"):
    with open("src/listing.txt", mode='r') as f:
        for line in f:
            #print(line)
            d = re.findall('^(.*?)\s+(.*?)\s+(.*?)\s+(.*?)\s+(.*?)\s+(.*?)\s+(.*?)\s+(.*?)\s+(.*?)\s+', line)
            #print(d)
            for idx, item in enumerate(d):
                print(item[4:])
    return d
我不知道如何实现适当的搜索,以从文件中获取一行
-rw-r--r--1 jttoivon hyad all 25399 Nov 2 21:25 exception_hierarchy.pdf
。到目前为止,它看起来如下:
('25399','Nov','2','21:25','exception\u hierarchy.pdf')
。有没有办法解决这个挑战


提前谢谢。

我不建议在这里使用正则表达式。情况很清楚,每一行都有明确的格式。那么,为什么不简单地使用string的
split()
方法呢

def result(line):
    tmp = line.split()
    return (
        int(tmp[4]),
        tmp[5],
        int(tmp[6]),
        int(tmp[7].split(":")[0]),
        int(tmp[7].split(":")[1]),
        tmp[8]
    )

line = '-rw-r--r-- 1 jttoivon hyad-all 25399 Nov 2 21:25 exception_hierarchy.pdf'

print(result(line))
# (25399, 'Nov', 2, 21, 25, 'exception_hierarchy.pdf')

更合适的方法是将
split()
的结果解包为命名变量,例如:

def result(line):
    permissions, hardlinks, owner_user, owner_group, filesize, month, day, time, filename = line.split()
    return (
        int(filesize),
        month,
        int(day),
        int(time.split(":")[0]),
        int(time.split(":")[1]),
        filename
    )

所以剩下的就是把
'21:25'
分成
21
25
。你试过使用
str.split
方法吗?@mkrieger1:不仅是这个(还有这个)。测试时,我收到以下错误:失败:test.test\u file\u listing.FileListing.test\u content'-rwx------'不是的实例:size的类型错误!失败:test.test\u file\u listing.FileListing.test\u names False不为空true@mkrieger1:嗯,我只是想找到一种方法,从每个元组中去掉前四项:)