Bestand openen in een andere map (Python)

Ik ben altijd een beetje in de war geweest over het onderwerp van de directory Traversal in Python, en hebben een situatie waarin ik benieuwd is: ik heb een bestand dat ik in een map in een map wil openen Momenteel in. Gezien deze mapstructuur:

\parentDirectory
    \subfldr1
        -testfile.txt
    \subfldr2
        -fileOpener.py

Ik probeer het script in FileOpener.py om uit subfldr2 te komen, in subfldr1 te komen en bel dan een open () op testfile.txt.

Van browsen Stackoverflow, ik heb mensen gezien osen os.pathom dit te bereiken, maar ik heb alleen voorbeelden gevonden met betrekking tot bestanden in subdirectory’s onder het scripts oorsprong.

Bewerkte hieraan, besefte ik dat ik gewoon het script kon verplaatsen naar subfldr1 en dan zou alles goed zijn, maar mijn nieuwsgierigheid is gepaard met hoe dit zou worden bereikt.

EDIT: deze vraag heeft met name betrekking op een Windows-machine, omdat ik niet weet hoe stationsletters en backslashes hierin zouden factor.


Antwoord 1, Autoriteit 100%

Als u het volledige pad naar het bestand kent, kunt u gewoon iets dergelijks doen. Als u echter rechtstreeks betrekking heeft op relatieve paden, waarvan ik onbekend ben en zou moeten onderzoeken en testen.

path = 'C:\\Users\\Username\\Path\\To\\File'
with open(path, 'w') as f:
    f.write(data)

bewerken:

Hier is een manier om het relatief te doen in plaats van absoluut. Niet zeker of dit op Windows werkt, moet u het testen.

import os
cur_path = os.path.dirname(__file__)
new_path = os.path.relpath('..\\subfldr1\\testfile.txt', cur_path)
with open(new_path, 'w') as f:
    f.write(data)

Bewerken 2:Een korte opmerking over __file__, dit werkt niet in de interactieve interpreter omdat het interactief wordt uitgevoerd en niet vanuit een echt bestand.


Antwoord 2, autoriteit 31%

import os
import os.path
import shutil

U vindt uw huidige directory:

d = os.getcwd() #Gets the current working directory

Vervolgens verander je één map omhoog:

os.chdir("..") #Go up one directory from working directory

Dan kun je een lijst/lijst van alle mappen krijgen, voor één map hoger:

o = [os.path.join(d,o) for o in os.listdir(d) if os.path.isdir(os.path.join(d,o))] # Gets all directories in the folder as a tuple

Vervolgens kun je in de tuple zoeken naar de gewenste map en het bestand in die map openen:

for item in o:
    if os.path.exists(item + '\\testfile.txt'):
    file = item + '\\testfile.txt'

Dan kun je dingen doen met het volledige bestandspad ‘bestand’


Antwoord 3, autoriteit 28%

from pathlib import Path
data_folder = Path("source_data/text_files/")
file_to_open = data_folder / "raw_data.txt"
f = open(file_to_open)
print(f.read())

Antwoord 4, autoriteit 17%

Het is een heel oude vraag, maar ik denk dat het nieuwelingen zal helpen om me te helpen die python leren.
Als je Python 3.4 of hoger hebt, wordt de pathlib-bibliotheek geleverd met de standaarddistributie.

Om het te gebruiken, geef je gewoon een pad of bestandsnaam door aan een nieuw Path()-object met voorwaartse slashes en het handelt de rest af. Om aan te geven dat het pad een onbewerkte tekenreeks is, plaatst u rvóór de tekenreeks met uw werkelijke pad.

Bijvoorbeeld

from pathlib import Path
dataFolder = Path(r'D:\Desktop dump\example.txt')

Bron: De gemakkelijke manier om met bestandspaden om te gaan op Windows, Mac en Linux

(unicode-fout) ‘ unicodeescape’ codec kan bytes op positie 2-3 niet decoderen: afgekapte \UXXXXXXXX escape

Other episodes