[英]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.