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

时间:2013-10-09 13:17:57

标签: python macos file subprocess popen

我在eclipse上编写了一个python代码,想要打开Downloads文件夹中的文件。我使用的是MAC OSX 10.8.2。我试过f=os.path.expanduser("~/Downloads/DeletingDocs.txt") 还有

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

我基本上想在子进程中打开一个文件,以收听打开文件中的更改。但是,在任何一种情况下都没有打开文件。

3 个答案:

答案 0 :(得分:3)

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()而没有任何参数,它将获取文件的全部内容。 这反过来不会关闭文件,它只是将“读取”指针放在文件的后面(为方便起见,在位置50)。

所以现在你的指针在文件中的字符50处,最后。 无论你在文件中写什么东西,都会把更多的数据放进去,所以下一个.read()将从50+位置获取数据,使.read()不为空,所以我们把“读取”指针放回去通过发出.seek(0)来定位0,然后我们打印所有数据。

将其与os.path.getmtime() 相结合,以对任何相反的更改或1:1比例更改(替换字符拼写错误等)进行罚款。

答案 1 :(得分:2)

我犹豫不决,因为这个问题是双重发布的,并且令人困惑,但是......如果你想使用默认编辑器在OSX中“打开”文件,那么添加open命令你的子进程。这对我有用:

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

答案 2 :(得分:0)

很可能是权限问题,如果您在Python解释器中尝试代码,当您调用subprocess.Popen时,您可能会从shell收到“权限被拒绝”错误。如果是这种情况,那么你需要使文件至少为700(默认情况下可能是644),你可能需要744。

尝试使用Python解释器中的代码并检查“权限被拒绝”错误,如果您看到,则在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等)相同