Nicht-GIS-Dateien über QGIS umbenennen?

8

Ich habe Tausende von PDFs, die bedeutungslose Namen haben und über mehrere Ordner verteilt sind. Ich muss sie umbenennen, und glücklicherweise werden die meisten von ihnen über Links in räumlichen Ebenen referenziert, in denen die Attributtabellen aussagekräftige Informationen zu den Dateien enthalten und eine Spalte namens "Hotlinks" einen Verzeichnispfad enthält, der auf die PDFs verweist.

Gibt es in QGIS eine Methode, die den Pfaden in den Attributtabellen folgen und die PDFs in diesem Pfad basierend auf den Attributen in der Ebene umbenennen kann? Ich werde ein neues Feld haben, das den neuen Namen enthält, z. concat ("Field1", "Field2", "Field3"), daher möchte ich die PDFs basierend darauf umbenennen.

Der Haken ... die PDFs sind verstreut und befinden sich nicht im selben Ordner, sodass das Skript nicht nur auf einen Ordner verweisen kann.

Rechnung
quelle
Sind die bedeutungslosen Namen von PDFs in Attributen von Formdateien vorhanden oder befinden sich Formdateien im selben Pfad wie die PDFs?
Shiko
Die bedeutungslosen Namen befinden sich in den Attributen am Ende der Verzeichnisverknüpfung im Verknüpfungsfeld. Z.B. c: \ folder \ 123456.pdf
Bill
Wenn Sie also die Quelle (bedeutungslos) und das Ziel (bedeutungsvoll) in derselben Aufzeichnung haben, können Sie meine Antwort unten versuchen
Shiko

Antworten:

15

Sie haben 2 Möglichkeiten:

1) Verwenden der PyQGIS + OS-Bibliothek: [QGIS muss als Administrator ausgeführt werden , um Dateien umzubenennen]

import os #needed to replace filenames
layer = iface.activeLayer() #get selected layer
selection = layer.selectedFeatures()
iface.activeLayer().selectAll()
for feature in selection:    
    if os.path.exists(feature['source']):
        os.rename(feature['source'], feature['target']) #rename files

2) Verwenden von Python + externer Bibliothek:
Verwenden Sie die folgende Bibliothek, um die DBF-Datei zu lesen + OS- Bibliothek zu importieren :

import os #needed to replace filenames
from dbfread import DBF #read dbf file
for record in DBF('MyFile.dbf'):
   if os.path.exists(record['source']):
      os.rename(record['Source'], record['target'])

Referenz:
https://pypi.python.org/pypi/dbfread

Shiko
quelle
Dank dafür. Ich habe jedoch nicht viel Glück ... Wenn ich dies in der Python-Konsole habe und den Befehl ausführe, sollten alle in den Shapefile-Datensätzen referenzierten PDF-Dateien von c: /meaningless1.pdf in c: /meaningful1.pdf usw. geändert werden. ? Eines meiner Shapefiles kann auch Hunderte von PDF-Links enthalten. Entschuldigung, ich bin ein bisschen wie ein Python-Noob.
Bill
Außerdem führe ich dies in der Konsole aus: Python-Konsole Verwenden Sie iface, um auf die QGIS-API-Schnittstelle zuzugreifen, oder geben Sie help (iface) ein, um weitere Informationen zu erhalten. Layer = iface.activeLayer () selection = layer.selectedFeatures () für die Funktion in Auswahl: os.rename (Feature ['Quelle'], Feature ['Ziel'])
Bill
@ Bill in PyQGIS, können Sie Ihren vollständigen Code in den Editor eingeben und ausführen, anstatt Zeile für Zeile in die Konsole zu schreiben
Shiko
Vielen Dank. Das Skript hat immer noch kein Glück und schreibt eine Python-Datei in meinen Ordner c: \ users ..... temp, benennt die PDFs jedoch nicht um. Ich habe das bedeutungslose Feld als "Quelle" und das bedeutungslose Feld als "Ziel". Würden die Feldnamen die Ursache sein? Prost
Bill
@Bill Können Sie versuchen, das QGIS als "Administrator" zu öffnen? Bekommst du einen Fehler?
Shiko