簡體   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