Suponha que o código python seja executado não conhecido pelo diretório anterior do Windows, digamos 'main', e onde quer que o código seja instalado quando for executado, ele deverá acessar o diretório 'main / 2091 / data.txt'.
como devo usar a função aberta (local)? qual deve ser a localização?
Editar:
Eu descobri que o código simples abaixo funcionará .. ele tem alguma desvantagem?
file="\2091\sample.txt"
path=os.getcwd()+file
fp=open(path,'r+');
python
file
path
relative-path
Camélia
fonte
fonte
r"\2091\sample.txt"
. Ou escapar deles como"\\2091\\sample.txt"
(mas isso é irritante). Além disso, 2) você está usando getcwd (), que é o caminho em que você estava quando executou o script. Eu pensei que você queria em relação à localização do script (mas agora estou me perguntando). E 3), sempre useos.path
funções para manipular caminhos. Sua linha de junção do caminho deve seros.path.join(os.getcwd(), file)
4) a; é inútilwith open(path, 'r+') as fp:
. Veja aqui a melhor explicação daswith
declarações que já vi.os.path.abspath
de obter facilmente o caminho completo do caminho relativo a ser aberto. declaração final é assim:os.path.abspath('./2091/sample.txt')
Respostas:
Com esse tipo de coisa, você precisa ter cuidado com o diretório atual de trabalho. Por exemplo, você não pode executar o script no diretório em que o arquivo está. Nesse caso, você não pode simplesmente usar um caminho relativo sozinho.
Se você tiver certeza de que o arquivo que você deseja está em um subdiretório abaixo de onde o script está realmente localizado, use-o
__file__
para ajudá-lo aqui.__file__
é o caminho completo para o local em que o script que você está executando.Então você pode mexer com algo assim:
fonte
__file__
é um caminho relativo (pelo menos na minha configuração, por algum motivo), e você precisa ligaros.path.abspath(__file__)
primeiro. osx / homebrew 2.7NameError: name '__file__' is not defined
Este código funciona bem:
fonte
Criei uma conta para esclarecer uma discrepância que acho que encontrei na resposta original de Russ.
Para referência, sua resposta original foi:
Essa é uma ótima resposta, pois está tentando criar dinamicamente um caminho absoluto do sistema para o arquivo desejado.
Cory Mawhorter notou que esse
__file__
é um caminho relativo (também está no meu sistema) e sugeriu o usoos.path.abspath(__file__)
.os.path.abspath
, no entanto, retorna o caminho absoluto do seu script atual (ou seja/path/to/dir/foobar.py
)Para usar este método (e como eu finalmente o fiz funcionar), você deve remover o nome do script do final do caminho:
O caminho abs_file_path resultante (neste exemplo) se torna:
/path/to/dir/2091/data.txt
fonte
os.path.dirname(os.path.abspath(__file__))
os.path.dirname
funcionalidade você mesmo, como fiz na minha resposta no ano passado.Depende do sistema operacional que você está usando. Se você deseja uma solução compatível com Windows e * nix, algo como:
deve funcionar bem.
O
path
módulo pode formatar um caminho para qualquer sistema operacional em que esteja sendo executado. Além disso, o python lida com caminhos relativos muito bem, desde que você tenha permissões corretas.Editar :
Como mencionado por kindall nos comentários, o python pode converter de qualquer maneira entre caminhos no estilo unix e no estilo windows, portanto um código mais simples funcionará:
Dito isto, o
path
módulo ainda possui algumas funções úteis.fonte
relpath()
converte um nome de caminho em um caminho relativo. Como já é um caminho relativo, não fará nada.os.path
módulo que seria uma escolha melhor?__file__
. Por favor, veja minha resposta.Gasto muito tempo para descobrir por que meu código não conseguiu encontrar meu arquivo executando o Python 3 no sistema Windows. Então eu adicionei. antes / e tudo funcionou bem:
fonte
file_path = os.path.join(script_dir, 'output03.txt')
script_dir = os.path.abspath(os.path.dirname(__file__))
Código:
Explicação:
Biblioteca de importação:
Use
__file__
para atingir o caminho do script atual:Separa o caminho do script em vários itens:
Remova o último item da lista (o arquivo de script real):
Adicione o caminho do arquivo relativo:
Junte-se aos itens da lista e adicione o arquivo do caminho relativo:
Agora você está pronto para fazer o que quiser com o arquivo, como, por exemplo:
fonte
path = "/".join(script_directory) + "/" + rel_path
você deve usar o módulo OS como empath = os.path.join(script_directory, rel_path)
. Em vez de analisar manualmente o caminho que você deve usarscript_path = os.path.dirname(__file__)
Se o arquivo estiver na sua pasta pai, por exemplo. follower.txt, você pode simplesmente usar
open('../follower.txt', 'r').read()
fonte
Tente o seguinte:
O Python 3.4 introduziu uma nova biblioteca padrão para lidar com arquivos e caminhos chamados pathlib. Funciona para mim!
fonte
Não tenho certeza se isso funciona em qualquer lugar.
Estou usando o ipython no ubuntu.
Se você quiser ler o arquivo no subdiretório da pasta atual:
seu script está na pasta atual, simplesmente tente o seguinte:
fonte
Python apenas passa o nome do arquivo que você atribui ao sistema operacional, que o abre. Se o seu sistema operacional suportar caminhos relativos como
main/2091/data.txt
(dica: sim), isso funcionará bem.Você pode achar que a maneira mais fácil de responder a uma pergunta como essa é experimentá-la e ver o que acontece.
fonte
getcwd()
. Eu li a descrição original como "relativa ao local onde executo o script, independentemente de onde o código fica".fonte
Quando eu era iniciante, achei essas descrições um pouco intimidantes. Como no começo eu tentaria
For Windows
e isso aumentaria um
syntax error
. Eu costumava ficar muito confuso. Depois de navegar no google. descobriu por que o erro ocorreu. Escrevendo isso para iniciantesÉ porque para o caminho ser lido em Unicode, você simplesmente adiciona um
\
ao iniciar o caminho do arquivoE agora funciona, basta adicionar
\
antes de iniciar o diretório.fonte
\t
como por exemplo\top\directory
, '\ t' é interpretado como um caractere de tabulação e seu 'truque' falha. A melhor opção é usar o formato de sequência brutar'C:\Users\chidu\Desktop\Skipper New\Special_Note.txt'
que não tenta 'escapar' dos caracteres.