我试图创建一个脚本,其中所有行都以' HELIX',' SHEET'和' DBREF'从.txt开始,从那些行获取一些特定列,然后将结果保存在新文件中。
#!/usr/bin/python
import sys
if len(sys.argv) != 3:
print("2 Parameters expected: You must introduce your pdb file and a name for output file.")`
exit()
for line in open(sys.argv[1]):
if 'HELIX' in line:
helix = line.split()
cols_h = helix[0], helix[3:6:2], helix[6:9:2]
elif 'SHEET'in line:
sheet = line.split()
cols_s = sheet[0], sheet[4:7:2], sheet[7:10:2], sheet [12:15:2], sheet[16:19:2]
elif 'DBREF' in line:
dbref = line.split()
cols_id = dbref[0], dbref[3:5], dbref[8:10]
modified_data = open(sys.argv[2],'w')
modified_data.write(cols_id)
modified_data.write(cols_h)
modified_data.write(cols_s)
我的问题是,当我尝试编写最终结果时,会出现此错误:
Traceback (most recent call last):
File "funcional2.py", line 21, in <module>
modified_data.write(cols_id)
TypeError: expected a character buffer object
当我尝试使用&#39;&#39; .join()转换为字符串时,它会返回另一个错误
Traceback (most recent call last):
File "funcional2.py", line 21, in <module>
modified_data.write(' '.join(cols_id))
TypeError: sequence item 1: expected string, list found
我做错了什么? 此外,如果有一些简单的方法来简化我的代码,它会很棒。 PS:我不是程序员,所以如果你做某事,我可能需要一些解释......
非常感谢。
答案 0 :(得分:0)
cols_id,cols_h和cols_s似乎是列表,而不是字符串。 您只能在文件中写入一个字符串,因此您必须将列表转换为字符串。
modified_data.write(' '.join(cols_id))
和类似的。
'!'.join(a_list_of_things)
将列表转换为用感叹号分隔每个元素的字符串
编辑:
#!/usr/bin/python
import sys
if len(sys.argv) != 3:
print("2 Parameters expected: You must introduce your pdb file and a name for output file.")`
exit()
cols_h, cols_s, cols_id = []
for line in open(sys.argv[1]):
if 'HELIX' in line:
helix = line.split()
cols_h.append(''.join(helix[0]+helix[3:6:2]+helix[6:9:2]))
elif 'SHEET'in line:
sheet = line.split()
cols_s.append( ''.join(sheet[0]+sheet[4:7:2]+sheet[7:10:2]+sheet[12:15:2]+sheet[16:19:2]))
elif 'DBREF' in line:
dbref = line.split()
cols_id.append(''.join(dbref[0]+dbref[3:5]+dbref[8:10]))
modified_data = open(sys.argv[2],'w')
cols = [cols_id,cols_h,cols_s]
for col in cols:
modified_data.write(''.join(col))
答案 1 :(得分:0)
这是一个解决方案(未经测试),可以将数据和代码分开一点。有一个数据结构(keyword_and_slices
)描述了在与为结果拍摄的切片配对的行中搜索的关键字。
然后代码遍历这些行并构建一个数据结构(keyword2lines
),将关键字映射到该关键字的结果行。
最后,每个关键字的收集行都会写入结果文件。
import sys
from collections import defaultdict
def main():
if len(sys.argv) != 3:
print(
'2 Parameters expected: You must introduce your pdb file'
' and a name for output file.'
)
sys.exit(1)
input_filename, output_filename = sys.argv[1:3]
#
# Pairs of keywords and slices that should be taken from the line
# starting with the respective keyword.
#
keyword_and_slices = [
('HELIX', [slice(3, 6, 2), slice(6, 9, 2)]),
(
'SHEET',
[slice(a, b, 2) for a, b in [(4, 7), (7, 10), (12, 15), (16, 19)]]
),
('DBREF', [slice(3, 5), slice(8, 10)]),
]
keyword2lines = defaultdict(list)
with open(input_filename, 'r') as lines:
for line in lines:
for keyword, slices in keyword_and_slices:
if line.startswith(keyword):
parts = line.split()
result_line = [keyword]
for index in slices:
result_line.extend(parts[index])
keyword2lines[keyword].append(' '.join(result_line) + '\n')
with open(output_filename, 'w') as out_file:
for keyword in ['DBREF', 'HELIX', 'SHEET']:
out_file.writelines(keyword2lines[keyword])
if __name__ == '__main__':
main()
代码跟随您的文字检查行是否以关键字启动,而不是代码检查某个关键字是否在一行内。
它还确保使用with
语句正确关闭所有文件。
答案 2 :(得分:-1)
您需要将作业中在RHS上创建的元组转换为字符串。
# Replace this with statement given below
cols_id = dbref[0], dbref[3:5], dbref[8:10]
# Create a string out of the tuple
cols_id = ''.join((dbref[0], dbref[3:5], dbref[8:10]))