繁体   English   中英

Python 解析txt,截取两个字符之间字符串的特定部分

[英]Python parsing txt, cut specific part of the string between two characters

我正在尝试制作一个脚本,该脚本将从加载的文件中剪切字符串的特定部分。

例如文件中的字符串是(有多行这样的,所有这些都应该这样做):

C:\d\projects\project1\folder1\folder2\folder3\folder4\file.h

想要的 output 将是:

C:\d\projects\project1\folder1\folder2\folder3\folder4

因此,在每一行中,只有文件夹的路径应该保留,而不是文件本身。

最好的方法是什么?

为什么不使用这样的转义\ split()并加入除最终文件名项目之外的所有内容。 如果您出于其他目的需要文件名,则使用 split() 并仅使用索引 -1 来获取该部分。

注意我在字符串前面添加了一个 r,所以所有反斜杠都保持不变。 您可以在此处阅读相关内容。

my_file_location = r"C:\d\projects\project1\folder1\folder2\folder3\folder4\file.h"

print('\\'.join(my_file_location.split('\\')[0:-1])) # path
>> C:\d\projects\project1\folder1\folder2\folder3\folder4

print(my_file_location.split('\\')[-1]) # filename
>> file.h

如果您想遍历这些文件名的列表,那么您可以执行以下操作:

import csv

output_list = []
with open('my_csv_example.csv', 'r') as f:
    csv_reader = csv.reader(f)
    for row in csv_reader:
        output_list.append('\\'.join(row[0].split('\\')[0:-1]))

with open('my_csv_output_example.csv', mode='w') as f2:
    csv_writer = csv.writer(f2, delimiter=',', quotechar='"', quoting=csv.QUOTE_MINIMAL)
    for row in output_list:
        csv_writer.writerow([row])

输入文件(my_csv_example.csv):

C:\d\projects\project1\folder1\folder2\folder5\folder1\file3.h
C:\d\projects\project1\folder1\folder2\folder4\folder2\file5.h
C:\d\projects\project1\folder1\folder2\folder3\folder3\file3.h
C:\d\projects\project1\folder1\folder2\folder2\folder4\file4.h
C:\d\projects\project1\folder1\folder2\folder1\folder5\file2.h

Output 文件(my_csv_output_example.csv):

C:\d\projects\project1\folder1\folder2\folder5\folder1
C:\d\projects\project1\folder1\folder2\folder4\folder2
C:\d\projects\project1\folder1\folder2\folder3\folder3
C:\d\projects\project1\folder1\folder2\folder2\folder4
C:\d\projects\project1\folder1\folder2\folder1\folder5

由于评论而更新,我认为您缺少的一点是尝试在列表上运行字符串 function 。 您可能需要列表中的第一个元素,即 0 所以这是您的关键位:

row[0].split('\\')[0:-1])

您可以使用pathlib获得广泛的跨平台路径支持。

在您的特定示例中:

from pathlib import PureWindowsPath

p=PureWindowsPath(r'C:\d\projects\project1\folder1\folder2\folder3\folder4\file.h')

然后就可以随意访问零件了:

>>> p.name
file.h
>>> p.parents[0]
C:\d\projects\project1\folder1\folder2\folder3\folder4
>>> p.parents[1]
C:\d\projects\project1\folder1\folder2\folder3
# etc

您可以更改路径的类型:

>>> p.as_uri()
file:///C:/d/projects/project1/folder1/folder2/folder3/folder4/file.h
>>> p.as_posix()
C:/d/projects/project1/folder1/folder2/folder3/folder4/file.h

Pathlib 还具有对通配符的内置支持。

给定这样的文件树:

.
├── a
│   └── sub_a
│       └── sub_sub_a
│           └── file.txt
├── b
│   └── sub_b
│       └── file2.txt
└── c
    └── file3.txt

你可以做:

for pn in (n for n in p.glob('**/*') if n.is_file()):
    print(pn)

印刷:

/tmp/test/a/sub_a/sub_sub_a/file.txt
/tmp/test/c/file3.txt
/tmp/test/b/sub_b/file2.txt

可以是包含文件的任何路径的路径:

for pn in (n for n in p.glob('**/*') if n.is_file()):
    print(pn.parents[0])

/tmp/test/a/sub_a/sub_sub_a
/tmp/test/c
/tmp/test/b/sub_b

这绝对是一种优越的方法。

因此,由于我一开始没有很好地解释我的问题(后来在评论中做了),我不得不解决这个问题,最后这段代码完成了这项工作:

for file in directory:
    f = open(file,'r')
    rows = f.readlines()
    array = []
    for i in rows:
        if i.endswith('.h\n'):
            array.append(i.replace(os.path.basename(i), ''))
    wf = open(file,'w')
    for row in array:
        wf.write(row+'\n')
    wf.close()

So it will go through all files inside of a folder and from this: C:\d\projects\project1\folder1\folder2\folder5\folder1\file3.h C:\d\projects\project1\folder1\folder2\folder4\ folder2\file5.h C:\d\projects\project1\folder1\folder2\folder3\folder3\file3.h C:\d\projects\project1\folder1\folder2\folder2\folder4\file4.h C:\d\项目\project1\folder1\folder2\folder1\folder5\file2.h

做这个:

C:\d\projects\project1\folder1\folder2\folder5\folder1 C:\d\projects\project1\folder1\folder2\folder4\folder2 C:\d\projects\project1\folder1\folder2\folder3\folder3 C: \d\projects\project1\folder1\folder2\folder2\folder4 C:\d\projects\project1\folder1\folder2\folder1\folder5

希望它会帮助别人!

这对于str.rfind()来说似乎是一个完美的情况。 它找到给定 substring 的最右边的索引,在本例中为\

list = [C:\d\projects\project1\folder1\folder2\folder5\folder1\file3.h, 
        C:\d\projects\project1\folder1\folder2\folder4\folder2\file5.h, 
        C:\d\projects\project1\folder1\folder2\folder3\folder3\file3.h, 
        C:\d\projects\project1\folder1\folder2\folder2\folder4\file4.h, 
        C:\d\projects\project1\folder1\folder2\folder1\folder5\file2.h]
for line in list:
    line = line[ 0 : line.rfind("\\") ]
    print(f"{line}\n")

Output:

C:\d\projects\project1\folder1\folder2\folder5\folder1
C:\d\projects\project1\folder1\folder2\folder4\folder2
C:\d\projects\project1\folder1\folder2\folder3\folder3
C:\d\projects\project1\folder1\folder2\folder2\folder4
C:\d\projects\project1\folder1\folder2\folder1\folder5

暂无
暂无

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

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