我试图将我的结果保存到一个新文件但遇到问题 - Python

时间:2014-09-17 11:02:06

标签: python extract pdb

我试图创建一个脚本,其中所有行都以' 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:我不是程序员,所以如果你做某事,我可能需要一些解释......

非常感谢。

3 个答案:

答案 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]))