2017-04-16 4 views
1
f = glob.glob('/fulldirectory/*.txt') 

for index, files in enumerate(f, 1): 
    r = open(files) 
    reader = csv.DictReader(r) 

So versuche ich den tatsächlichen Namen einer Datei als Teil meiner Analyse zu drucken.Drucken Name aus der Datei

Jede Datei im Verzeichnis oben mit dieser Konvention benannt: R1.txt, R2.txt, R3.txt usw.

Im Moment habe ich einfach die enumerate Funktion bin mit von der Anzahl drucken - Dies funktioniert jedoch nur unter der Annahme, dass keine Dateien im Verzeichnis fehlen.

EDIT:

Ich versuchte dies, aber es gibt mir nicht ganz das, was ich will:

p = [int(s) for s in files if files.isdigit()] 

print p 

>[0,1] 
>[0,2] 

Antwort

0

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.... 
  1. Die sorted() Funktion wird die Liste der Dateinamen zu sortieren, dann speichern Sie es in f (f ist die sortierte Version von file_list)

  2. 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

  3. Lambda-Sortierung ist eine anonyme Funktion, das Argument ‚x‘ akzeptiert, funktioniert dies auf die gleiche Weise wie ein re.findalldef NoName(x): return something

  4. Verwenden alle Substrings zu finden, die die Regex übereinstimmt, in In diesem Fall sollte nur einer übereinstimmen [d.'abc123.txt' kehrt [123]]

  5. '\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.

  6. os.path.basename() wird verwendet, um die Basisnamen (der letzte Teil des Weges [dh. 'abc123.txt' von '\a\b\c\abc123.txt']) abrufen

  7. seit re.findall() immer eine Liste zurück, so das einzige Spiel abzurufen wird beinhalten unter Verwendung von [0] (dh. ['123',][0] =>'123')

  8. 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.

  9. 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/

+0

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. –

+0

Können Sie die Methode basename erklären? Ich bin mir nicht ganz sicher, was eine Menge von diesem Code tatsächlich tut. –

+0

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

0

Gehen Sie einfach wie folgt aus:

f = glob.glob('/fulldirectory/*.txt') 

for files in f: 
    print files.split('\\')[-1].split('.')[0] 
+0

Danke. Das funktioniert, aber ich versuche auch, den tatsächlichen Dateinamen zu drucken. Der obige Code gibt auch das gesamte Verzeichnis aus. Gibt es eine Möglichkeit, das zu umgehen? –

+0

Sicher, wenn Sie Pfadprobleme haben, versuchen Sie die Bearbeitung. – zipa