我正在编写一个数据库程序,而personica是我的测试对象(我通常在文件路径的位置有一个变量,但出于测试和演示的目的,我只有一个字符串。)。在我的计算机上的这个确切位置有一个文本文件(我在这里更改了我的用户名,顺便说一句,因为我是偏执狂。),但它说:
ah
这是代码行:
Traceback (most recent call last):
File "C:\Users\Admin\Documents\Project
Documentation\InteractiveExecutable.py", line 46, in <module>
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'
我确信它就在那里,当我将该地址复制到Windows资源管理器中时,我会直接使用该文本文件。
任何人都知道为什么这不起作用?
答案 0 :(得分:2)
new-ish pathlib
module(在Python&gt; = 3.4中提供)非常适合处理类似路径的对象(Windows和其他操作系统)。
简化:您可以构建任何路径(目录和文件路径对象被视为完全相同)作为对象,该对象可以是绝对路径对象或相对路径对象。您可以使用原始字符串来创建复杂路径(即r'string'
)和pathlib
将非常宽容。但是,请注意,有更好的方法来构建路径而不是原始字符串(请参见下文)。
以下是示例:
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
请注意,如果您使用的是Windows pathlib
,请原谅您在第二个示例中使用“错误的斜杠”。最后讨论为什么你应该总是使用正斜杠。
简单显示一些有用的路径 - 例如当前工作目录和用户主页 - 如下所示:
# 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)
要在文件树中向下导航,您可以执行以下操作。请注意,第一个对象home
是Path
,其余的只是字符串:
some_person = home/'Documents'/'Project Documentation'/'personica.txt' # or
some_person = home.join('Documents','Project Documentation','personica.txt')
要阅读位于路径的文件,您可以使用其open
方法而不是open
函数:
with some_person.open() as f:
dostuff(f)
但你也可以直接抓住文字!
contents = some_person.read_text()
content_lines = contents.split('\n')
...并直接写文字!
data = '\n'.join(content_lines)
some_person.write_text(data) # overwrites existing file
通过这种方式检查它是文件还是目录(并且存在):
some_person.is_dir()
some_person.is_file()
创建一个新的空文件而不像这样打开它(静默替换任何现有文件):
some_person.touch()
要使文件仅在不存在时,请使用exist_ok=False
:
try:
some_person.touch(exist_ok=False)
except FileExistsError:
# file exists
创建一个新目录(在当前目录下,Path()
),如下所示:
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
以这种方式获取路径的文件扩展名或文件名:
some_person.suffix # empty string if no extension
some_person.stem # note: works on directories too
对路径的整个最后部分使用name
(如果它们在那里,则为词干和扩展名):
some_person.name # note: works on directories too
使用with_name
方法重命名文件(返回相同的路径对象但使用新文件名):
new_person = some_person.with_name('personica_new.txt')
您可以使用iterdir
:
all_the_things = list(Path().iterdir()) # returns a list of Path objects
\
)在路径字符串中使用反斜杠时要小心,尤其是结束带反斜杠的路径。与任何字符串一样,即使在原始输入模式中,Python也会将终止反斜杠作为转义字符读取。观察:
>>> r'\'
File "<stdin>", line 1
r'\'
^
SyntaxError: EOL while scanning string literal
如果你不知道这个问题,这将给出一个非常神秘的错误信息:
>>> Path(r'C:\')
File "<stdin>", line 1
Path(r'\')
^
SyntaxError: EOL while scanning string literal
此错误的原因是\'
被假定为字符串中的单引号。这样可以正常工作:'\''
(第二个单引号结束字符串)。
如果您坚持使用反斜杠,请务必使用原始输入模式,否则您将遇到问题。例如,'\t'
字符代表一个选项卡。所以当你这样做时(没有原始输入):
>>> Path('C:\temp')
您正在将一个制表符添加到路径中。这是完全合法的,Python不会抱怨,直到你做了一些导致Windows尝试将其转换为真正的Windows路径的东西:
>>> Path('C:\temp').resolve()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
OSError: [WinError 123] The filename, directory name, or volume label syntax is incorrect: 'C:\temp'
如果您不知道发生了什么,这也是一个非常神秘的错误!最好在弄乱路径时完全避免使用反斜杠字符。
您在创建文件时错误地添加了双重扩展名时出现问题。要使用pathlib
阻止此问题,请使用touch
方法制作文件:
some_person = Path.home()/'Documents'/'Project Documentation'/'personica.txt'
some_person.touch()
答案 1 :(得分:1)
在Windows上,我喜欢将Python的原始字符串格式用于文件路径:
path = r'C:/Users/Admin/Documents/Project Documentation/personica.txt'
请注意字符串开头的r
。另请注意,正斜杠也很重要。
然后我可以执行常规的Python open()
命令:
with open(path) as fobj:
for line in fobj:
print line
请参阅Python的词法分析文档中的String Literals部分:
答案 2 :(得分:0)
好的,我修好了。当我命名文件时,它被称为personica.txt,并且是一个文本文件。所以它的全名是personica.txt.txt。当我更改名称时,它工作正常。感谢大家的帮助和投入,我从中学到了它甚至没有为解决方案做出贡献。