打开文件路径无法在python中工作

时间:2017-06-09 18:37:44

标签: python file

我正在编写一个数据库程序,而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资源管理器中时,我会直接使用该文本文件。

任何人都知道为什么这不起作用?

3 个答案:

答案 0 :(得分:2)

new-ish pathlib module(在Python&gt; = 3.4中提供)非常适合处理类似路径的对象(Windows和其他操作系统)。

It's Paths - Paths all the way down

简化:您可以构建任何路径(目录和文件路径对象被视为完全相同)作为对象,该对象可以是绝对路径对象相对路径对象。您可以使用原始字符串来创建复杂路径(即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)

要在文件树中向下导航,您可以执行以下操作。请注意,第一个对象homePath,其余的只是字符串:

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。当我更改名称时,它工作正常。感谢大家的帮助和投入,我从中学到了它甚至没有为解决方案做出贡献。