在Python中循环write命令以分别从列表中输出许多不同的索引

2024-10-02 02:23:49 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图得到如下输出:

KPLR003222854-2009131105131

在文本文件中。我试图导出输出的方式如下:

with open('Processed_Data.txt', 'r') as file_P, open('KIC_list.txt', 'w') as namelist:
    nameData = []           
    for line in file_P:
        splt_file_P = line.split()
        nameData.append(splt_file_P[0])
    for key in nameData:
        namelist.write('\n' 'KPLR00' + "".join(str(w) for w in nameData) + '-2009131105131')

但是,我有一个问题,nameData数组中的数字都同时出现在指定的输出中,而不是像上面所示的那样干净地使用on ID,输出是这样的:

KPLR00322285472138721382172198371823798123781923781237819237894676472634973256279234987-2009131105131

因此,我的问题是如何循环write命令,使每个单独的ID(每个ID都有一个特定的索引值,但有超过150个)能够正确输出。你知道吗

编辑: 另外,列表中的一些ID的长度不一样,所以我想在“key”的前面加上0,使它们都等于9位数字。我通过在KPLR中加上引号来欺骗它,但不是所有的ID都需要两个0。问题是,我能在KPLR和密钥之间加上0来匹配9位格式吗?你知道吗


Tags: keyintxtidforasline数字
3条回答

只是为了好玩:

with open('Processed_Data.txt', 'r') as file_P, open('KIC_list.txt', 'w') as namelist:
    nameData = [line.split()[0] for line in file_P]
    namelist.write("\n".join("KPLR00" + str(key) + '-2009131105131' for key in nameData))

我想那会有用的,但我还没有测试过。您可以通过完全不使用nameData使它变得更小/更丑,只需在其位置使用列表理解。你知道吗

您可以更改:

"".join(str(w) for w in nameData)

对此:

",".join(str(w) for w in nameData)

基本上,“,”将用逗号分隔nameData列表中的元素。如果您使用"",那么就不会有任何东西来分隔元素,因此它们会同时出现。您可以根据需要更改分隔符。你知道吗

您的代码看起来像人们期望的那样工作:"".join(str(w) for w in nameData)生成一个由nameData中每个项的串联组成的字符串。你知道吗

机会是你想要的

for key in nameData:
    namelist.write('\n' 'KPLR00' + key + '-2009131105131')

或者更好:

for key in nameData:
    namelist.write('\nKPLR%09i-2009131105131'%int(key)) #no string concatenation

字符串连接往往比较慢,而且如果您不仅对字符串进行操作,还需要显式调用str。下面是一对显示差异的ideone片段:http://ideone.com/RR5RnLhttp://ideone.com/VH2gzx

同样,上面的格式字符串为'%09i'的表单将填充0,使数字最多为9位。因为格式是'%i',所以我添加了一个到int的显式转换。有关详细信息,请参见此处:http://docs.python.org/2/library/stdtypes.html#string-formatting-operations

最后,这里是一个单行版本(除了with语句,您当然应该保留它):

namelist.write("\n".join("KPLR%09i-2009131105131"%int(line.split()[0]) for line in file_P))

相关问题 更多 >

    热门问题