python3打开文件路径_打开文件路径在python中不起作用

I am writing a database program and personica is my test subject (I would usually have a variable in the place of the file path, but for test and demo purposes I just have a string.). There is a text file at this exact location on my computer (I have changed my username on here, by the way because I am paranoid.), but it says:

Traceback (most recent call last):

File "C:\Users\Admin\Documents\Project

Documentation\InteractiveExecutable.py", line 46, in

ReadPerson = open("C:/Users/Admin/Documents/Project

Documentation/personica.txt", 'r')

IOError: [Errno 2] No such file or directory:

'C:/Users/Admin/Documents/Project Documentation/personica.txt'

This is the line of code:

ReadPerson = open("C:/Users/Admin/Documents/Project Documentation/personica.txt", 'r')

I am certain that it is there and when I copy that address into Windows Explorer, it takes me right to the text file.

Anyone know why this is not working?

解决方案

The new-ish pathlib module (available in Python >= 3.4) is great for working with path-like objects (both Windows and for other OSes).

To simplify: you can build up any path (directory and file path objects are treated exactly the same) as an object, which can be an absolute path object or a relative path object. You can use raw strings to make complex paths (i.e., r'string') and pathlib will be very forgiving. However, note that there are better ways to build up paths than raw strings (see further down).

Here are examples:

from pathlib import Path

Path(r'c:\temp\foo.bar') # absolute path

Path(r'c:/temp/foo.bar') # same absolute path

Path('foo.bar') # different path, RELATIVE to current directory

Path('foo.bar').resolve() # resolve converts to absolute path

Path('foo.bar').exists() # check to see if path exists

Note that if you're on Windows pathlib forgives you for using the "wrong slash" in the second example. See discussion at the end about why you should probably always use the forward slash.

Simple displaying of some useful paths- such as the current working directory and the user home- works like this:

# Current directory (relative):

cwd = Path() # or Path('.')

print(cwd)

# Current directory (absolute):

cwd = Path.cwd()

print(cwd)

# User home directory:

home = Path.home()

print(home)

# Something inside the current directory

file_path = Path('some_file.txt') # relative path; or

file_path = Path()/'some_file.txt' # also relative path

file_path = Path().resolve()/Path('some_file.txt') # absolute path

print(file_path)

To navigate down the file tree, you can do things like this. Note that the first object, home, is a Path and the rest are just strings:

some_person = home/'Documents'/'Project Documentation'/'personica.txt' # or

some_person = home.join('Documents','Project Documentation','personica.txt')

To read a file located at a path, you can use its open method rather than the open function:

with some_person.open() as f:

dostuff(f)

But you can also just grab the text directly!

contents = some_person.read_text()

content_lines = contents.split('\n')

...and WRITE text directly!

data = '\n'.join(content_lines)

some_person.write_text(data) # overwrites existing file

Check to see if it is a file or a directory (and exists) this way:

some_person.is_dir()

some_person.is_file()

Make a new, empty file without opening it like this (silently replaces any existing file):

some_person.touch()

To make the file only if it doesn't exist, use exist_ok=False:

try:

some_person.touch(exist_ok=False)

except FileExistsError:

# file exists

Make a new directory (under the current directory, Path()) like this:

Path().mkdir('new/dir') # get errors if Path()/`new` doesn't exist

Path().mkdir('new/dir', parents=True) # will make Path()/`new` if it doesn't exist

Path().mkdir('new/dir', exist_ok=True) # errors ignored if `dir` already exists

Get the file extension or filename of a path this way:

some_person.suffix # empty string if no extension

some_person.stem # note: works on directories too

Use name for the entire last part of the path (stem and extension if they are there):

some_person.name # note: works on directories too

Rename a file using the with_name method (which returns the same path object but with a new filename):

new_person = some_person.with_name('personica_new.txt')

You can iterate through all the "stuff' in a directory like so using iterdir:

all_the_things = list(Path().iterdir()) # returns a list of Path objects

Sidebar: backslashes (\)

Be careful when using backslashes in a path string, especially ending a path with a backslash. As with any string, Python will read that terminating backslash as an escape character even in raw input mode. Observe:

>>> r'\'

File "", line 1

r'\'

^

SyntaxError: EOL while scanning string literal

So this will give a pretty cryptic error message if you are not aware of this issue:

>>> Path(r'C:\')

File "", line 1

Path(r'\')

^

SyntaxError: EOL while scanning string literal

The reason for this error is that \' is assumed to be a single quotation in the string. This works fine: '\'' (the second single quotation ends the string).

If you insist on using backslashes, be sure to use raw input mode or you will run into problems. For example, the '\t' character represents a tab. So when you do this (without raw input):

>>> Path('C:\temp')

You are putting a tab character into your path. This is perfectly legal and Python won't complain until you do something that causes Windows to try turning it into a real Windows path:

>>> Path('C:\temp').resolve()

Traceback (most recent call last):

File "", line 1, in

OSError: [WinError 123] The filename, directory name, or volume label syntax is incorrect: 'C:\temp'

This is also a very cryptic error if you do not know what is going on! Best to avoid the backslash characters altogether when messing about with paths.

Preventing Your Problem

Your problem occurred when you created your file and erroneously added a double extension. To prevent this issue using pathlib, use the touch method to make the file:

some_person = Path.home()/'Documents'/'Project Documentation'/'personica.txt'

some_person.touch()

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值