1

我有两个文件(Running-2015-01-01.txt 和 Running-2015-01-02.txt),每个文件都有设备主机名信息。我的目标是通过剥离“正在运行”重命名这些文件,并将其替换为文件内容中的设备主机名。

这就是我到目前为止所拥有的。解释器没有显示任何错误,但我的目标文件没有任何反应:

for filename in glob.glob("Running*"):
    selected_file = open(filename, "r").readlines()
    for i, s in enumerate(filename):
        if "hostname" in filename:
            hostname_file = str(filename[i][8:]).strip()
            os.rename(filename, hostname_file + filename[7:])

我还创建了单独的函数来重命名文件并从文件中收集内容信息,它们可以工作。

从文件内容中收集信息

def collect_string():
    filename = raw_input("Enter your filename : ")
    selected_file = open(filename, "r")
    line = selected_file.readlines()
    date_time = datetime.datetime.now().strftime("%Y-%m-%d")

    for i, s in enumerate(line):
        if "hostname" in s:
            output = str(line[i][8:]).strip()
            print output

重新命名文件

def rename_file():
    for filename in os.listdir("."):
        if filename.startswith("Running"):
            os.rename(filename, "Config" + filename[6:])
4

1 回答 1

0

在您的collect_string函数中,您测试“主机名”是否在文件的行中,这有效。在您的第一个函数中,您测试它是否在文件名中,这当然不起作用。

此外,您不需要使用enumerate. 您可以使用语法很好地遍历列表for element in myList,就像在您的函数中一样rename_file

最后为了避免混淆,我建议使用更清晰的变量名。

这是您的代码已修复(但未经测试):

def rename():
  for filename in glob.glob("Running*"):
    newName=collect_hostname(filename)+ filename[7:]
    os.rename(filename,newName)

def collect_hostname(filename)
    with open(filename) as f:     #best practice to open a file
      for line in f:
        if "hostname" in line:
          return line[8:].strip() #line is already a string, no need for str
于 2015-08-29T20:46:44.683 回答