如何为"选定文本"编写Automator / Applescript服务;操作转换为工作Python"文本文件"操纵代码

时间:2016-01-13 17:23:03

标签: python applescript

所以我有一个python脚本从文本文件中获取文本,可以"制表" (放入类似表格的形式)该文件中的行,将最终格式化的文本写入另一个文本文件;

i=0
k=4  #determains columns of "tabular" form

f1 = open("lines-grouped.txt", 'wb')
with open("lines-to-group.txt", 'r') as multilines_filea:
    multilines = multilines_filea.readlines()

for line in multilines:
    line = line.strip()
    if i == k-1:
        i=0
        f1.writelines([bytes(line + '\r\n','UTF-8')])
    else:
        f1.writelines([bytes(line + ' | ','UTF-8')])
        i=i+1

multilines_filea.close()
f1.close()

这里有一个主要的限制我认为Automator服务会解决,也就是说我想要制表的任何文本片段都需要保存在我的" lines-to-group.txt"文件。

理想情况下,我希望它如此简单;

on run(input, parameters)
-- My Python Logic to manipulate "input"
return input
end run

其中input是任何应用程序中的选定文本。然后,当我遇到以下问题时(我在将表格从富文本格式复制到Evernote时发现);

Name
Age
Position
Salary
John Doe
21
Test Analyst
$60,000
Joe Dirt
30
Janitor
$30,000
Jane Doe
55
Executive
$150,000

我可以在当前音符/文件中选择所有内容,然后运行Automator服务来获取;

Name | Age | Position | Salary
John Doe | 21 | Test Analyst | $60,000
Joe Dirt | 30 | Janitor | $30,000
Jane Doe | 55 | Executive | $150,000

我的python代码现在给了我什么,但我必须把我想要的格式化到另一个文件然后运行脚本然后从我的输出文件中复制格式化的文本,这太简单了。 / p>

所以真正的问题是;我如何获得Applecript来处理我的"输入"我的python脚本读取和处理其输入的方式?

2 个答案:

答案 0 :(得分:0)

这就是你如何做到的。首先制作Python脚本的oneliner,就像这样(这里的前两行只是用于测试的输入):

s = 'Name\nAge\nPosition\nSalary\nJohn Doe\n21\nTest Analyst\n$60,000' #partial list
k = '4'
print '\n'.join([' | '.join(s.split('\n')[i:i+int(k)]) for i in range(0,len(s.split('\n')),int(k))])

然后,您可以在AppleScript中将Python代码作为shell脚本运行。您可以使用Python sys库传入输入值,将 s k 替换为sys.argv[1]sys.argv[2]。因此,您放入Automator / AppleScript的最终代码如下所示:

on run {input, parameters}
    set numberOfColumns to 4
    repeat with selectedText in input
        set pythonScript to "import sys; print '\\n'.join([' | '.join(sys.argv[1].split('\\n')[i:i+int(sys.argv[2])]) for i in range(0,len(sys.argv[1].split('\\n')),int(sys.argv[2]))])"
        set result to do shell script "python -c " & quoted form of pythonScript & space & quoted form of selectedText & space & numberOfColumns
    end repeat
end run

设置服务在任何应用程序中接收选定的“文本”,勾选输出替换所选文本,然后它应该可以工作,即如果您在编辑的应用程序中使用它已启用。 玩得开心!

答案 1 :(得分:0)

大多数最终答案来自turningtested,但他们的最初\\n对我没有任何作用(对于其他人,我不知道,\\r做了相同),所以我做了一个明确可识别的分隔符|><|然后将result更改为preresult并添加;

    set AppleScript's text item delimiters to {"|><|"}
    set result to every text item of preresult

脚本完全按照我的需要运行,将选定的文本列表为numberOfColumns列(item | item | item | ... \ newline)。

on run {input, parameters}
    set numberOfColumns to 3 -- Column Number May add UI to input on demand
    repeat with selectedText in input
        set pythonScript to "import sys; print '|><|'.join([' | '.join(sys.argv[1].split('\\n')[i:i+int(sys.argv[2])]) for i in range(0,len(sys.argv[1].split('\\n')),int(sys.argv[2]))])"
        set preresult to do shell script "python -c" & quoted form of pythonScript & space & quoted form of selectedText & space & numberOfColumns
    end repeat
    set AppleScript's text item delimiters to {"|><|"}
    set result to every text item of preresult
end run