【问题标题】:How to write the Automator/Applescript Service for "Selected Text" Manipulation converted from working Python "text from file" Manipulation code如何为从工作 Python“文件中的文本”操作代码转换的“选定文本”操作编写 Automator/Applescript 服务
【发布时间】:2016-01-14 14:25:19
【问题描述】:

所以我有一个 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 Service即可获取;

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

这是我的 python 代码现在给我的,但是我必须将我想要格式化的内容放入另一个文件中,然后运行脚本,然后从我的输出文件中复制格式化的文本,这太乏味了。

所以真正的问题是;如何让 applescript 以我的 python 脚本读取和处理其输入的方式来处理我的“输入”?

【问题讨论】:

  • 我不确定我是否正确理解了你的问题,你想如何传递数据:applescript --> python script, python script --> applescript or applescript --> python script - -> 苹果脚本?
  • 理想情况下,我希望它像输入是从任何应用程序中选择的文本一样简单。然后选定的文本被发送到服务(Automator/Applescript),新的 Automator/Applescript 友好逻辑,曾经是我的 python 逻辑(我知道它以自己的方式工作),操作并返回选定的文本。
  • 好的,所以你想让applescript基本上和python脚本做同样的事情?
  • @turingtested,是的......所以假设applescript中的 input 相当于我的python multilines 列表我得到“with iline在 input" 中替换我的主要 python for 循环,我想,但是我不知道如何在 applescript 中构造一个 output 我可以返回类似于我的 python 脚本中的“lines-grouped.txt”。

标签: python applescript


【解决方案1】:

这就是你可以做到的。首先做一个 Python 脚本的单行,像这样(这里的前两行只是测试的输入):

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 库传入输入值,将 sk 替换为 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

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

【讨论】:

  • @turningtested,非常感谢!它几乎完全按照我的预期工作,但我没有在 numberOfColumns 之后得到换行符,它只是用“|”替换所有换行符......但它是我开始寻找的好地方在。如果我得到它,我会更新我所做的,因为如果你有更多要添加的内容,我相信你会更新我:)
  • 我只需将“\\n”的第一个实例更改为可识别的 delimiter 并将结果更改为 preresult 我可以更改为列表形式作为实际的结果,我也会将其作为答案发布,但是;将 pythonScript 设置为 "import sys; print '|>
【解决方案2】:

大部分最终答案来自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

【讨论】:

    猜你喜欢
    • 2016-09-08
    • 2016-09-06
    • 2016-01-11
    • 2011-01-11
    • 1970-01-01
    • 1970-01-01
    • 2013-04-23
    • 1970-01-01
    • 2010-11-29
    相关资源
    最近更新 更多