如何用python在mac OSX 10.8.2上打开文件

2024-06-28 22:13:47 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在eclipse上编写一个python代码,希望打开Downloads文件夹中的一个文件。我正在使用MacOSX10.8.2。我试过f=os.path.expanduser("~/Downloads/DeletingDocs.txt") 还有

ss=subprocess.Popen("~/Downloads/DeletingDocs.txt",shell=True)
ss.communicate()

我基本上想在subprocess中打开一个文件,来监听打开的文件中的更改,但是在这两种情况下文件都不会打开。


Tags: 文件path代码txt文件夹trueosdownloads
3条回答

我很犹豫是否回答,因为这个问题是双重张贴和混乱的措辞,但。。。如果要使用默认编辑器在OSX中“打开”该文件,请将open命令添加到子进程中。这对我有效:

subprocess.Popen("open myfile.txt",shell=True)

这很可能是一个权限问题,如果您在Python解释器中尝试代码,那么在调用subprocess.Popen时,您可能会收到来自shell的“Permission denied”错误。如果是这种情况,那么您需要使文件最少700个(默认情况下可能是644个),您可能需要744个。

请尝试Python解释器中的代码,并检查“Permission denied”错误,如果您看到该错误,请在shell中执行此操作:

chmod 744 ~/Downloads/DeletingDocs.txt

然后运行脚本。要在Python中完成这一切,可以使用os.system:

import os
import subprocess

filename = "~/Downloads/DeletingDocs.txt"
os.system("chmod 744 "+filename)
ss=subprocess.Popen(filename, shell=True)
ss.communicate()

它在Windows中“工作正常”的原因是Windows不支持与*nix系统(如Linux、BSD、OS X等)一样的文件权限类型(读、写和执行)。

from os.path import baspath, expanduser
filepath = abspath(expanduser("~/") + '/Downloads/DeletingDocs.txt')
print('Opening file', filepath)
with open(filepath, 'r') as fh:
    print(fh.read())

注意OSX文件处理方式,IO根据文件类型有所不同。 例如,在Windows下被视为“纯文本文件”的.txt文件实际上是OSX下的压缩数据流,因为OSX试图“智能”存储空间。

如果你不知道的话,这可能会毁了你的一天。。继续)

例如,当双击OSX中的一个.txt文件时,通常会弹出文本编辑器,它所做的是调用一个os.open(),而不是在一个较低的级别上访问它,而这个级别允许OSX中间层执行disk-area|decompression pipe|file-handle -> Texteditor,但是如果您在较低的级别上访问文件对象,则最终会打开存储文件的磁盘区域,如果您打印你会得到垃圾数据,因为它不是你期望的数据。

所以尝试使用:

import os
fd = os.open( "foo.txt", os.O_RDONLY )
print(os.read(fd, 1024))
os.close( fd )

摆弄旗帜。 我真的不记得这两个文件中的哪一个会像从磁盘一样打开文件(open()os.open()),但是其中一个会使您的数据看起来像垃圾,有时您只是得到解压缩管道的指针(即使文本文件是hughe,也会给您提供大约4字节的数据)。

如果它正在跟踪/捕获您想要的文件的更新

from time import ctime
from os.path import getmtime, expanduser, abspath
from os import walk

for root, dirs, files in walk(expanduser('~/')):
    for fname in files:
        modtime = ctime(getmtime(abspath(root + '/' + fname)))
        print('File',fname,'was last modified at',modtime)

如果时间和你上次的支票不一样,那就用它做些酷的事情。 例如,Python可以使用这些库:

还有更多,所以不要将打开外部应用程序作为第一个修复程序,而是尝试通过Python打开它们并根据您的喜好进行修改,而只能作为最后的手段(即使是这样)通过Popen打开外部应用程序。

但既然你要求了(有点。。。呃),这里有一个Popen方法:

from subprocess import Popen, PIPE, STDOUT
from os.path import abspath, expanduser
from time import sleep

run = Popen('open -t ' + abspath(expanduser('~/') + '/example.txt'), shell=True, stdout=PIPE, stdin=PIPE, stderr=STDOUT)

##== Here's an example where you could interact with the process:
##== run.stdin.write('Hey you!\n')
##== run.stdin.flush()

while run.poll() == None:
    sleep(1)

过度解释你的工作:

这将打印每次更改的文件内容。

with open('test.txt', 'r') as fh:
    import time
    while 1:
            new_data = fh.read()
            if len(new_data) > 0:
                fh.seek(0)
                print(fh.read())
            time.sleep(5)

工作原理: 常规文件打开程序with open() as fh将打开文件并将其作为句柄放在fh中,一旦调用.read()而不使用任何参数,它将获取文件的全部内容。 这反过来又不会关闭文件,它只是将“reading”指针放在文件的后面(为了方便起见,可以说是放在位置50)。

现在你的指针在文件的第50个字符的末尾。 无论你在文件中写什么,都会在文件中放入更多的数据,这样下一个.read()将从位置50+获取数据,使.read()不为空,因此我们通过发出.seek(0)将“reading”指针放回位置0,然后打印所有数据。

将其与os.path.getmtime()结合起来,以微调任何反向更改或1:1比率更改(替换字符拼写错误等)。

相关问题 更多 >