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

如何用python在mac OSX 10.8.2上打开文件,python,macos,file,subprocess,popen,Python,Macos,File,Subprocess,Popen,我正在eclipse上编写python代码,希望打开下载文件夹中的一个文件。我正在使用MacOSX10.8.2。我试过使用f=os.path.expanduser(“~/Downloads/DeletingDocs.txt”) 还有 ss=subprocess.Popen("~/Downloads/DeletingDocs.txt",shell=True) ss.communicate() 我基本上想在子流程中打开一个文件,以侦听打开的文件中的更改。但是,无论是哪种情况,文件都不会打开 fro

我正在eclipse上编写python代码,希望打开下载文件夹中的一个文件。我正在使用MacOSX10.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试图对存储空间进行“智能化”

这会毁了你的一天,除非你知道(去过那里,头痛..继续)

例如,在OSX中双击
.txt
文件时,通常会弹出文本编辑器,它所做的是调用
os.open()
而不是在较低级别上访问它,OSX中间层可以在较低级别上访问磁盘区域|解压缩管道|文件句柄->文本编辑器但是如果在较低级别上访问文件对象,最终会打开存储文件的磁盘区域,如果打印数据,则会收到垃圾,因为它不是您期望的数据

因此,请尝试使用:

import os
fd = os.open( "foo.txt", os.O_RDONLY )
print(os.read(fd, 1024))
os.close( fd )
摆弄旗帜。 老实说,我不记得这两种方法中的哪一种是从磁盘原样打开文件的(
open()
os.open()
),但其中一种方法会使您的数据看起来像垃圾,有时您只会得到指向解压缩管道的指针(即使文本文件是Hugh,也会给您4字节的数据)

如果它正在跟踪/捕获所需文件的更新 如果时间和你上次检查的时间不一样,那就用它做些冷静的事情。 例如,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)
工作原理: 使用open()作为fh的常规文件开启器
将打开文件并将其作为句柄放置在
fh
中,一旦调用
.read()
而不使用任何参数,它将获取文件的全部内容。 这反过来又不会关闭文件,它只是将“读取”指针放在文件的后面(为了方便起见,可以说是放在位置50)

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


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

这很可能是权限问题,如果您在Python解释器中尝试代码,您可能会收到“权限被拒绝”的消息调用subprocess.Popen时shell出错。如果是这种情况,那么您需要将文件的最小值设置为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等)相同的文件权限类型(读、写和执行)。

我不愿回答这个问题,因为这个问题是双重发布的,措辞混乱,但是。。。如果要使用默认编辑器在OSX中“打开”文件,请将
open
命令添加到子流程中。这对我很有用:

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

Popen
的第一个参数应该是可执行文件,而不是文本文件。@cdarke ss=subprocess.Popen(“~/Downloads/DeletingDocs.txt”,shell=True)在windows中工作正常。但在MacOSX中,它不起作用。在Windows下,我希望任何执行不可执行文件的尝试都会运行默认应用程序来打开这些文件。充其量,这是对Popen的滥用,因为它肯定不可移植。它在控制台中打印文件内容。实际上,我想像往常一样打开一个文件,比如textediter。这样我就可以编辑文件了。它在控制台中打印文件内容。实际上,我想像往常一样打开一个文件,比如textediter。这样我就可以编辑文件了。实际上,我想打开不同的文件类型,比如.odt、.csv、.pdf等等。你在第一个答案中没有提到这一点。其次,您应该以编程方式打开它们,并跟踪更改,而不是通过子流程通道。主要原因是,与外部应用程序相比,您检查它所需的资源要少得多。其次,Python支持您提到的所有这些文件类型。(请参阅我的编辑)@HarishBarvekar检查最新编辑顺便说一句,它显示了如何在没有任何问题的情况下进行Popen方式(在我的旧Mac book pro上进行了测试)。您的代码中有一个输入错误:在第一行“from os.path import baspath,expanduser”,baspath应该是abspathYes,有“权限被拒绝”。我试过你的代码,但没用。我想打开一个文件,不像在控制台中打印内容。我想打开任何文件类型,编辑其内容并保存它。在这种情况下,您可能不想使用子流程。只需直接打开文件并对其进行操作(例如读、写和编辑)
subprocess.Popen("open myfile.txt",shell=True)