通过 Python 从 .txt 文件中给定的行创建元组
create tuples from lines given in .txt file via Python
以下是文件 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_listing
并且应该 return 使用一些正则表达式的元组列表(大小、月、日、小时、分钟、文件名) ;我选择了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_hierarchy.pdf")
。到目前为止,它看起来如下:('25399', 'Nov', '2', '21:25', 'exception_hierarchy.pdf')
。有解决挑战的想法吗?
提前致谢。
我不建议在这里使用正则表达式。情况很清楚,每一行都有明确定义的格式。那么为什么不简单地使用字符串的 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
)
以下是文件 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_listing
并且应该 return 使用一些正则表达式的元组列表(大小、月、日、小时、分钟、文件名) ;我选择了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_hierarchy.pdf")
。到目前为止,它看起来如下:('25399', 'Nov', '2', '21:25', 'exception_hierarchy.pdf')
。有解决挑战的想法吗?
提前致谢。
我不建议在这里使用正则表达式。情况很清楚,每一行都有明确定义的格式。那么为什么不简单地使用字符串的 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
)