Kan ik meerdere directories koppelen in os.path()

Pagina: 1
Acties:

Onderwerpen

Vraag


Acties:
  • 0 Henk 'm!

  • Jokiehints
  • Registratie: Februari 2019
  • Laatst online: 02-04-2024
Mijn vraag:

Kan ik meerdere directories in een Path commando combineren en vastleggen zodat ik niet telkens per file het relatieve pad moet herhalen?

Uitleg: ik heb een script geschreven in Python waarbij ik meerdere files moet lezen en schrijven die in verschillende directories staan. Mijn hoofdprogramma staat in de root en de bestanden die ik wil gebruiken staan in twee aparte folders.
Een folder draagt de naam: "Data" , "Tekst"
Het zou fijn zijn als ik deze directories kan betrekken in een soort ‘werkomgeving’ waarin alle bestanden kunnen worden gevonden.

Relevante software en hardware die ik gebruik:

Python 3.7

Wat ik al gevonden of geprobeerd heb:

Ik heb diverse combinaties geprobeerd met os.path.abspath() en os.path.relpath() maar een werkend commando heb ik nog niet voor elkaar gekregen. Heeft iemand tips of een verwijzing naar uitleg van de mogelijkheden?

Alle reacties


Acties:
  • 0 Henk 'm!

  • BasilFX
  • Registratie: Mei 2004
  • Laatst online: 11-09 08:28

BasilFX

BasilFX

Ik heb niet helemaal scherp wat je precies zou willen, maar als je eenvoudig paden wilt combineren, dan zou je ook eens kunnen kijken naar pathlib.

Met pathlib kun je gemakkelijk paden combineren d.m.v. standaard operators. Wellicht versimpelt dit je doel.

http://www.basilfx.net


Acties:
  • 0 Henk 'm!

  • Nick_S
  • Registratie: Juni 2003
  • Laatst online: 09:52

Nick_S

++?????++ Out of Cheese Error

En hoe wil je er dan mee omgaan als er in die 2 directories een bestand staat met dezelfde naam? Het idee is juist dat een pad (directories + bestandsnaam) een bestand uniek maken.

'Nae King! Nae quin! Nae Laird! Nae master! We willna' be fooled agin!'


Acties:
  • 0 Henk 'm!

  • Gomez12
  • Registratie: Maart 2001
  • Laatst online: 17-10-2023
[pseudocode]
mkdir temp
copy data\*.* temp\
copy tekst\*.* temp\
[/pseudocode]
Alleen ik zou gewoon voor je toepassingen etc uitgaan van absolute paden ipv enkel filenames...

Acties:
  • 0 Henk 'm!

  • Nick_S
  • Registratie: Juni 2003
  • Laatst online: 09:52

Nick_S

++?????++ Out of Cheese Error

Gomez12 schreef op woensdag 22 januari 2020 @ 16:53:
[pseudocode]
mkdir temp
copy data\*.* temp\
copy tekst\*.* temp\
[/pseudocode]
Alleen ik zou gewoon voor je toepassingen etc uitgaan van absolute paden ipv enkel filenames...
[pseudocode]
- Lees en schrijf naar temp/
- Copy bestanden terug naar eigen directory... Uhhh... oh oh ;-)
/[pseudocode]

'Nae King! Nae quin! Nae Laird! Nae master! We willna' be fooled agin!'


Acties:
  • 0 Henk 'm!

  • Gomez12
  • Registratie: Maart 2001
  • Laatst online: 17-10-2023
@Nick_S Lullig gezegd was de vraag niet om de bestanden terug te halen uit de 'werkomgeving'...

Alleen gewoon uitgaan van absolute paden van dir + filenaam ipv enkel filenaam voorkomt het hele probleem. En tja, dan neem je maar 1 of 2 bytes extra geheugen in gebruik voor het ook opslaan van het absolute pad maar we zitten niet meer op een commodore 64 te programmeren.

Acties:
  • 0 Henk 'm!

  • Morrar
  • Registratie: Juni 2002
  • Laatst online: 08:54
Al gekeken naar glob? Daarmee kun je meerdere files selecteren op basis van een patroon, bijvoorbeeld een pad en een extensie.

Het resultaat van glob is een lijst van absolute bestandspaden, waar je vervolgens overheen kunt gaan om ze in te lezen / te verwerken.

Voor het wegschrijven zou je dan eenvoudig een functie kunnen maken die de bestandsnamen opbouwt.

In het simpelste geval iets als dit:

Python:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
from os import path
from glob import glob

output_dir = "data/cleansed/text"
text_files = glob("data/input/text/*.txt")

def construct_output_path(fpath, fname):
    return os.path.join(fpath, fname)

# Process all input files
for in_path in text_files:
    
    # Read input
    with open(in_path, "r") as in_file:

        # Process the file...
        
        # Construct output file path
        out_path = construct_output_path(output_dir, path.basename(in_path))
        
        # Write output
        with open(out_path, "w") as out_file:
            ...


Maar je kunt / moet het veel netter opdelen met functies natuurlijk :)

[ Voor 49% gewijzigd door Morrar op 23-01-2020 17:01 ]


Acties:
  • 0 Henk 'm!

  • Ben(V)
  • Registratie: December 2013
  • Laatst online: 10:26
Gewoon os.walk gebruiken om vanuit de parentfolder van "Data en "Tekst" door alle bestanden te gaan.

Dus stel je hebt deze folders:
C:/parent/Data
C:/parent/Tekst

Dan print deze code een lijst van bestandsnamen inclusief directory
code:
1
2
3
4
for DirName, DirNames, FileNames in os.walk('C://parent'):
    if DirName[4:] in ['Data', 'Tekst']:
        for File in FileNames:
            print os.path.join(DirName, File)

[ Voor 9% gewijzigd door Ben(V) op 24-01-2020 13:09 ]

All truth passes through three stages: First it is ridiculed, second it is violently opposed and third it is accepted as being self-evident.


Acties:
  • 0 Henk 'm!

  • Raynman
  • Registratie: Augustus 2004
  • Laatst online: 10:35
Waarom alle subdirs afgaan als je al precies weet welke je wilt hebben? Waarom zou je dan niet gewoon twee keer os.listdir aanroepen? Of os.walk als recursie gewenst is. Elimineer je ook meteen bugs door verkeerd slicen van DirName.

Globben is vrij beperkt en lijkt me niet direct handig op basis van de TS, maar verder blijft het gissen, want het is niet echt duidelijk hoe de bestanden verder gebruikt worden.

Als TS alleen een path search wil zoals voor executables met PATH of Python modules met sys.path, dan is dat natuurlijk vrij makkelijk zelf te implementeren, maar vziw is er niet echt een standaardfunctie voor (imp.find_module is te specifiek voor modules).

Edit: je zou shutil.which kunnen misbruiken. Als je een eigen path en mode opgeeft, zou het moeten werken voor niet-uitvoerbare bestanden en kun je evt. ook nog selecteren op write access.

[ Voor 12% gewijzigd door Raynman op 24-01-2020 15:36 ]

Pagina: 1