Sie können nur eine einfache re.sub
tun, um die .txt
auf eine leere Zeichenfolge zu ersetzen.
import re, glob
f = glob.glob('/fulldirectory/*.txt')
for file in f:
print(re.sub('\.txt$', '', file))
r = open(file)
reader = csv.DictReader(r)
In einer idealen Welt würde ich 'index', und bei der ersten Iteration drucken, würde R01 gedruckt werden. Dann R02 usw.
Wenn Sie sie mögen immer sein, um, tun dies stattdessen zuerst sortieren die Dateinamen:
f = sorted(glob.glob('/fulldirectory/*.txt'))
Wenn Sie nur den Basisnamen der Datei drucken möchten Sie können dies stattdessen drucken:
import os
print(re.sub('\.txt$', '', os.path.basename(file)))
Hinweis: um die andere Art und Weise nicht sehr sicher vorgeschlagen, weil es nicht empfohlen wird mehrere Splits auf Dateinamen zu verwenden. Hier
ist ein komplettes Beispiel mit anständiger Erklärung, dass die OP angefordert:
import re, os, glob
file_list = glob.glob('/fulldirectory/*.txt') # get the list of file names that ends in .txt
f = sorted(file_list, key = lambda x: int(re.findall('\d+\.txt$',os.path.basename(x))[0]))
# 1 2 3 8 4 5 6 7
for file in f:
print(re.sub('\.txt$', '', file))
# 9
# do your stuff....
Die sorted()
Funktion wird die Liste der Dateinamen zu sortieren, dann speichern Sie es in f (f ist die sortierte Version von file_list)
das key
Argument ist eine Funktion, die ein Argument und gibt einen sortierbare Gegenstand übernimmt (dh. str
, int
, list
...), ist es verwendet, um den Schlüssel zu definieren, es mit
Lambda-Sortierung ist eine anonyme Funktion, das Argument ‚x‘ akzeptiert, funktioniert dies auf die gleiche Weise wie ein re.findall
def NoName(x): return something
Verwenden alle Substrings zu finden, die die Regex übereinstimmt, in In diesem Fall sollte nur einer übereinstimmen [d.'abc123.txt'
kehrt [123]
]
'\d+\.txt$'
ein regulärer Ausdruck ist, \d+
- jede Zahl ein oder mehrere Male wiederholt wird, \.
ist ein regulärer Punkt .
eine \
vor Theres weil normalerweise in regex, ein .
die besondere Bedeutung hat, die es darstellt jedes Zeichen, das \
es entkommt, so dass es nur eine reguläre .
, txt
ist eine Zeichenfolge an der angegebenen Stelle übereinstimmen, und $
ist das Symbol angibt, dass es nur an die Ende der Zeichenfolge übereinstimmen.
os.path.basename()
wird verwendet, um die Basisnamen (der letzte Teil des Weges [dh. 'abc123.txt'
von '\a\b\c\abc123.txt'
]) abrufen
seit re.findall()
immer eine Liste zurück, so das einzige Spiel abzurufen wird beinhalten unter Verwendung von [0] (dh. ['123',][0]
=>'123'
)
weil die abgerufenen Daten ein String ist, haben die int() verwenden es für den Vergleich mit einem int
zu ändern. Der Int wurde in # 2 an key
übergeben.
re.sub('\.txt$', '', file)
das erste Argument ist ein regulärer Ausdruck, das zweite Argument ist die Zeichenkette, die es zu ersetzen, das dritte Argument ist die Zeichenfolge, die ersetzt werden müssen (dh. re.sub('a', '', 'banana')
=>bnn
weil es jeden a
mit nichts ersetzt) Check # 5, um weitere Informationen über die regex
Wenn Sie mehr Klärung benötigen, sagen Sie mir
Alternative Methode des Imports ist dies:
import glob
from re import sub, findall
from os.path import basename
file_list = glob.glob('/fulldirectory/*.txt') # get the list of file names that ends in .txt
f = sorted(file_list, key = lambda x: int(findall('\d+\.txt$',basename(x))[0]))
for file in f:
print(sub('\.txt$', '', file))
# do your stuff....
hilfreiche Links:
https://docs.python.org/3/library/re.html
https://docs.python.org/3/library/os.path.html
https://docs.python.org/3/tutorial/
Dank. Am Ende habe ich eine Methode benutzt, die die Ziffern aus dem Verzeichnis nimmt und in einer Liste speichert. Das funktioniert - aber es funktioniert nur unter der Annahme, dass keine anderen Nummern im Verzeichnis vorhanden sind, was nicht ideal ist. Ich werde jedoch zu Ihrer Methode wechseln. Ich verstehe nicht ganz, wie es funktioniert. –
Können Sie die Methode basename erklären? Ich bin mir nicht ganz sicher, was eine Menge von diesem Code tatsächlich tut. –
Ein Hinweis: sortierte Methode hat einen Schlüsselparameter, in dem Sie eine Funktion übergeben können, um ihm zu sagen, wie man sortiert, wenn Sie nur mit den letzten beiden Zahlen sortieren wollten: 'f = sorted (glob.glob (' /fulldirectory/*.txt'),key=lambda x: os.path.basename (x) .rstrip (". txt") [- 2:]) ' – abccd