【问题标题】:Replacing part of a string and adding to it not producing the intended results替换字符串的一部分并添加到它不会产生预期的结果
【发布时间】:2016-02-12 04:04:34
【问题描述】:

我正在编写我的第一个脚本:尝试从文件夹(标题为 Thing_XXfilename.png)中获取所有文件名,删除一些初始字符(Thing_XX)以及它们的扩展名,然后将它们一个接一个地插入到重复的代码行。

我尝试了几十种变体,但由于某种我无法理解的原因,输出正在迭代每个原始文件名的字符(替换没有影响)并将它们一个接一个地插入到代码中。

nf0 = 'Events.OnGameStart.Add( function ()\n\tif MyScript then\n'
nf1 = ' if MyScript.Thing.XX'
nf2 = ' then\n\t\telse\n\t\t\tMyScript.Thing.XX'
nf3 = ' = {"Misc.", nil, nil, "'
nf4 = '", "MyMod.XX'
nf5 = '", "Thing_XX'
nf6 = '", nil, nil, nil};\n\t\t\tend\n'
nfn = ' end\nend)'

import os

f = open("textures.lua", "w")
f.write(nf0)
for files in os.listdir(r'C:\Users\Myuser\Textures'):
    for filename in files:
        line = filename.replace('Thing_XX', '')
        line = filename.replace('.png', '')
        f.write(nf1 + filename + nf2 + filename + nf3 + filename + nf4 + filename + nf5 + filename + nf6)
f.write(nfn)
f.close()

这应该会产生:

if MyScript.Thing.XXfilename1 then
        else
            MyScript.Thing.XXfilename1 = {"Misc.", nil, nil, "filename1", "MyMod.XXfilename1", "Thing_XXfilename1", nil, nil, nil};
            end

但结果却是这样:

if MyScript.Thing.XXT then
        else
            MyScript.Thing.XXT = {"Misc.", nil, nil, "T", "MyMod.XXT", "Thing_XXT", nil, nil, nil};
            end

此处显示的字母“T”是第一个文件名的第一个字母(然后对所有文件名的每个字母重复令人作呕)。

【问题讨论】:

  • 您确定C:\Users\Myuser\Textures 不是空目录吗?
  • 绝对!我有一个 Python 吐出的 6MB textures.lua 来证明它:-P 虽然我应该使用像 %username% 这样的相对路径,但无法让它工作。
  • 你应该尝试使用 python 的字符串格式化功能。它会让你的代码更容易阅读。
  • @veggie1:R Nar 打败了我。很高兴他这样做了,我不确定如何使用该格式...下次我会寻找该选项。
  • 下一次,只需突出显示您要格式化的所有代码,然后按 ctrl+K :)

标签: python python-3.x replace lua filenames


【解决方案1】:

您使用的是双循环,而您只需要一个循环。

f = open("textures.lua", "w")
f.write(nf0)
for filename in os.listdir(r'C:\Users\Myuser\Textures'):
    line = filename.replace('Thing_XX', '')
    line = line.replace('.png', '')   ## also need to change this 
    f.write(nf1 + line + nf2 + line + nf3 + line + nf4 + line + nf5 + line + nf6)

【讨论】:

  • 我知道这将是一个明显的错误!但这是可耻的明显!谢谢你。有用! :D
  • 虽然还有一个问题:替换不起作用,但正在写入包含初始 Thing_XX 和扩展名的完整原始文件名:(
  • 必须进行编辑...您替换的逻辑不太正确(仔细检查上面的代码)
  • 不,抱歉。那也不行。如此接近,令人伤脑筋!
  • 哦,哎呀,抱歉,再修复一个……在写语句中应该是“line”而不是“filename”
【解决方案2】:
import os

base_string = (
    'something something {filename}\n'
    'something else {filename} blah blah')

output = ''

f = open("textures.lua", "w")
for filename in os.listdir(r'C:\Users\Myuser\Textures'):
    filename.replace('Thing_XX', '')
    filename.replace('.png', '')
    output += base_string.format(filename=filename)

output = (
    'top of file\n'
    '{output}\n'
    'bottom of file').format(output=output))

f.write(output)
f.close()

【讨论】:

  • 为了学习,我会使用它,因为我没有完全理解所有这些陈述,但是 gariepy 已经把它钉牢了,它不需要这么大的重写。我能否用一个后续问题打扰您:如何格式化 'C:\Users\%Username%' 环境变量,以便 % 运算符不会弄乱它?
【解决方案3】:

您可以使用它来获取用户主目录:

os.getenv("HOME")

例如

print os.getenv("HOME")

会回来

c:\users\username

【讨论】:

  • path = os.getenv("HOME") + "\textures" 然后os.listdir(r 'path')?
猜你喜欢
  • 2017-06-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-14
  • 1970-01-01
  • 1970-01-01
  • 2018-10-25
  • 1970-01-01
相关资源
最近更新 更多