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