繁体   English   中英

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

[英]How to open a file on mac OSX 10.8.2 in python

我正在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()

我基本上想在子进程中打开一个文件,以监听打开的文件中的更改。但是,无论哪种情况,文件都不会打开。

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试图“精简”存储空间。

除非您对此有所了解,否则这可能会毁掉您的一天(在那里,头疼……继续前进)

.txt在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打开外部应用程序。

但是,由于您请求了它(有点... erm),所以这是一种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()不为空,因此我们将“读取”指针放回位置0通过发出.seek(0) ,然后打印所有数据。

将其与os.path.getmtime()结合使用可细化任何反向更改或1:1比例更改(替换字符拼写错误等)。

我很犹豫,因为这个问题是重复发布的,而且措辞很混乱,但是……如果您想使用默认编辑器在OSX中“打开”文件,则将open命令添加到子进程中。 这对我有用:

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

这很可能是权限问题,如果您在Python解释器中尝试代码,则在调用subprocess.Popen时可能会从外壳收到“权限被拒绝”错误。 如果是这种情况,那么您将需要使文件最少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等)不支持文件权限类型(读取,写入和执行)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM