【问题标题】:How do I copy specific strings from a text file with python?如何使用 python 从文本文件中复制特定字符串?
【发布时间】:2019-06-19 23:19:23
【问题描述】:

我在天文学领域工作,我用来解压缩从望远镜获得的图像的过程可能非常乏味。图像的格式是“fits.fz”,代表fits.fits-zipped。我想将这些解压缩为“.fits”。我已经在开发一个程序来简化这个解压缩过程。我通过 Python 和 Tkinter 创建了一个带有两个按钮的图形界面。第一个按钮创建一个名为“list.txt”的文本文件,然后执行一个预先存在的 .bat 文件,该文件将特定目录中以“fits.fz”结尾的每个文件的名称转储到“list.txt”中。第一个按钮还应该将文件的特定名称复制到另一个 bat 文件中非常特定的位置。另一个 .bat 文件称为“Decompress.bat”,应该对“list.txt”中的每个文件使用以下命令:

 C:\ds9\ds9.exe 
 C:\directory\FITS FILE HERE 
-savefits

我希望 python 程序能够从一行代码中复制特定部分并将它们粘贴到“FITS FILE HERE”所在的位置。

以下是按下第一个按钮时执行的函数。

 f = open('C:/jah/list.txt')
 f1 = open('C:/jah/decompress.bat', 'a')

 def begin_wombocombo(): #Is function for first button
     open('C:/jah/list.txt', 'w').close() #Clears 'list.txt'
     open('C:/jah/decompress.bat', 'w').close() #Clears 'decompress.bat'
     subprocess.call([r'C:/jah/newbat.bat']) #Dumps directory into 'list.txt'

     doIHaveToCopyTheLine=False #Bool for whether or not the program has to copy line
     for line in f.readlines(): #loops through all instances to find fz files and then pastes them into decompress.bat
       if 'fits.fz' in line:
         doIHaveToCopyTheLine=True
       if doIHaveToCopyTheLine:
         f1.write(line)
     f1.close()
     f.close()

这个问题是它只复制包含 fit.fz 文件的文本行。这意味着它会复制该行中的所有其他内容,例如创建文件的时间。有什么方法可以简单地单独复制和粘贴 fit.fz 文件?我将如何将这些字符串处理到 .bat 文件中?

感谢您抽出宝贵时间,顺便说一句,第二个按钮只是执行“decompress.bat”,这是带有解压缩图像命令的文件。

【问题讨论】:

  • 也许你只需要使用os.listdir()而不是subprocess.call([r'C:/jah/newbat.bat'])(别忘了在第一行使用import os
  • @CrafterKolyan 如果我使用 os.listdir(),我将如何将它粘贴到 decompress.bat 文件中?编辑:格式化
  • 就像你现在做的那样。 f1.write(line)
  • 看来你可以通过直接从python调用ds9.exe来简化这个过程,而不是写出bat文件——还是这个过程比这更复杂?
  • @Blorgbeard 我对 python 还很陌生,所以我不知道该怎么做。你能指出我正确的方向吗?

标签: python


【解决方案1】:

我认为在 Python 中,这样的事情可以解决问题,而无需写出批处理文件等。

import os
import subprocess

target_directory = 'C:\\directory\\' # change this as required
zipped_files = [x for x in os.listdir(target_directory) 
                   if x.lower().endswith('.fits.fz')]
for filename in zipped_files:
    subprocess.call([r'C:\ds9\ds9.exe', os.path.abspath(filename), '-savefits'])

【讨论】:

  • 我现在正在尝试实现它。我没有看到任何事情发生。我需要替换“文件名”或“os.path.abspath”吗?
  • 这很奇怪。我目前在 linux 上,我显然没有ds9.exe,但从我的测试来看,它应该可以工作。您根本看不到任何输出吗?
  • 哦,可能是字符串中的反斜杠,尝试添加我刚刚编辑的r
  • 啊,这是在当前目录上工作 - 您可能必须将包含文件的目录传递给 listdir()
  • 是的,就是这样。我还只需要编辑文件路径。 "C:/SAOImageDS9/ds9.exe"
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-26
  • 2014-08-23
  • 1970-01-01
  • 2013-08-08
相关资源
最近更新 更多