【问题标题】:How do I read in specific characters from each line of text and write it out to another file?如何从每行文本中读取特定字符并将其写入另一个文件?
【发布时间】:2017-12-29 06:23:01
【问题描述】:

我有一个名为“tclust.txt”的 txt 文件和另一个名为“ef_blue.txt”的文件。 我正在尝试编写一个 python 脚本,它允许我将某些字符从 ef_blue.txt 导入到 tclust.txt。 到目前为止,我只能从 ef_blue.txt 中读取值,并将该 txt 文件中的所有内容都转到 tclust.txt。 我的 ef_blue.txt 有多行文本,但我只想从每行中获取某些字符(例如:第 2 行中的“7.827382”和第 2 行中的“6.432342”。

blue = open("ef_blue.xpk", "rt")
contents = blue.read()

with open("tclust.txt","a") as f2: 
    f2.writelines(contents)

blue.close()
f2.close()

编辑:我的 tclust.txt 文件如下所示:

"输入 rbclust

峰值 0 8.5 0.05 4.0 0.05

Atom 0 125.H8 126.H1' 标签数据集 sw sf"

我的 ef_blue.xpk 文件如下所示:

"标签数据集sw sf

1H 1H_2

NOESY_F1eF2f.nv

4807.69238281 4803.07373047

600.402832031 600.402832031

1H.L 1H.P 1H.W 1H.B 1H.E 1H.J 1H.U 1H_2.L 1H_2.P 1H_2.W 1H_2.B 1H_2.E 1H_2.J 1H_2.U vol int stat 注释 flag0 flag8 flag9

0 {} 7.45766 0.01702 0.03286 ++ {0.0} {} {} 5.68094 0.07678 0.15049 ++ {0.0} {} 0.0 4.8459 0 {} 0 0 0

1 {} 8.11276 0.02278 0.03212 ++ {0.0} {} {} 5.52142 0.07827 0.11252 ++ {0.0} {} 0.0 2.0824 0 {} 0 0 0

2 {} 7.85285 0.02369 0.02232 ++ {0.0} {} {} 5.52444 0.07280 0.06773 ++ {0.0} {} 0.0 0.8844 0 {} 0 0 0

3 {} 7.45819 0.01630 0.02914 ++ {0.0} {} {} 5.42587 0.07081 0.11733 ++ {0.0} {} 0.0 2.8708 0 {} 0 0 0

4 {} 7.89775 0.01106 0.00074 ++ {0.0} {} {} 5.23989 0.07077 0.00226 ++ {0.0} {} 0.0 0.4846 0 {} 0 0 0

5 {} 7.85335 0.02665 0.03635 ++ {0.0} {} {} 5.23688 0.09117 0.12591 ++ {0.0} {} 0.0 1.5210 0 {} 0 0 0"

所以我想做的是从我的 ef_blue.xpk 中取出第 7 行的字符,例如“7.45766”和“5.68094”,并将其写到我的 tclust.txt 文件的第 3 行

所以我希望我的 tclust.txt 文件看起来像:

类型 rbclust
峰值 0 8.5 0.05 4.0 0.05
       7.45766 5.68094
       8.11276 5.52142
 .... 等等
Atom 0 125.H8 126.H1'label dataset sw sf

Edit2: @open-source

This is the output I get

【问题讨论】:

  • 您的预期输出是什么?您的“tclust.txt”样本是什么?最终的“tclust.txt”在操作后应该是什么样子?
  • 嗨,我刚刚编辑了我的问题,希望能回答你的问题
  • 我认为你需要正则表达式。
  • 什么意思?
  • @user130306 Sam Chats 的意思是这样的:stackoverflow.com/questions/13423624/…

标签: python


【解决方案1】:
blue = open("ef_blue.txt", "rt")
contents = blue.readlines()

with open("tclust.txt","a") as f2: 
    for cont in range(len(contents)):
        if cont > 5:
            a = contents[cont].split(' ')
            print(a[2]+ '  ' + a[9])
            f2.writelines(a[2] + '  '+ a[9] + '  ')


blue.close()
f2.close()

尝试这样做,使用 readlines 来转换列表中的每一行,然后使用 for 来处理列表并检查是否在适当的行中,最后将列表中的实际行用空格分隔,告诉我那个工作

【讨论】:

  • 嗨!谢谢你的回答。我刚试过,但它说:
  • 文件“readIn.py”,第 13 行,在 中 print(a[2]+ ' ' + a[9]) IndexError: index out of range: 2
  • 好吧,对我有用的尝试删除该行,这并不重要,然后删除 tclust.txt 或用另一个名称重命名并告诉我。输入 print(a) 而不是那个 print,只是为了检查列表是否存在
【解决方案2】:

您可以尝试以下方法:

import re

# read tclust.txt file line by line 
# remove last line and empty second last line
# save last line in variable

lines = open('tclust.txt').readlines()
last_line = lines[-1]

# update tclust.txt without last two lines 
open('tclust.txt', 'w').writelines(lines[:-2])

# Open both files
with open("ef_blue.xpk", "rt") as f1, open("tclust.txt","a") as f2:
    # Read ef_blue.xpk line by line 
    for line in f1.readlines():
        # check for 1.23232 format numbers
        float_num = re.findall("[\s][1-9]{1}\.[0-9]+", line)
        # if any digit found in line that matches format
        # assumming there must be 2 in line if found
        if len(float_num)>1:
            # write with 6 empty spaces in the beginning and separated by tab
            f2.writelines(' '*6 + float_num[0] + '\t' + float_num[1] + '\n')

    # finally write the last line earlier removed
    f2.writelines(last_line)

tclust.txt 的输出:

"type rbclust

Peak 0 8.5 0.05 4.0 0.05
       7.45766   5.68094
       8.11276   5.52142
       7.85285   5.52444
       7.45819   5.42587
       7.89775   5.23989
       7.85335   5.23688
Atom 0 125.H8 126.H1' label dataset sw sf"

输入:ef_blue.xpk

"label dataset sw sf

1H 1H_2

NOESY_F1eF2f.nv

4807.69238281 4803.07373047

600.402832031 600.402832031

1H.L 1H.P 1H.W 1H.B 1H.E 1H.J 1H.U 1H_2.L 1H_2.P 1H_2.W 1H_2.B 1H_2.E 1H_2.J 1H_2.U vol int stat comment flag0 flag8 flag9

0 {} 7.45766 0.01702 0.03286 ++ {0.0} {} {} 5.68094 0.07678 0.15049 ++ {0.0} {} 0.0 4.8459 0 {} 0 0 0

1 {} 8.11276 0.02278 0.03212 ++ {0.0} {} {} 5.52142 0.07827 0.11252 ++ {0.0} {} 0.0 2.0824 0 {} 0 0 0

2 {} 7.85285 0.02369 0.02232 ++ {0.0} {} {} 5.52444 0.07280 0.06773 ++ {0.0} {} 0.0 0.8844 0 {} 0 0 0

3 {} 7.45819 0.01630 0.02914 ++ {0.0} {} {} 5.42587 0.07081 0.11733 ++ {0.0} {} 0.0 2.8708 0 {} 0 0 0

4 {} 7.89775 0.01106 0.00074 ++ {0.0} {} {} 5.23989 0.07077 0.00226 ++ {0.0} {} 0.0 0.4846 0 {} 0 0 0

5 {} 7.85335 0.02665 0.03635 ++ {0.0} {} {} 5.23688 0.09117 0.12591 ++ {0.0} {} 0.0 1.5210 0 {} 0 0 0"

输入:tclust.txt

"type rbclust

Peak 0 8.5 0.05 4.0 0.05

Atom 0 125.H8 126.H1' label dataset sw sf"

【讨论】:

  • 嗨!非常感谢,这段代码对我很有帮助。但是我的输出有一些问题。我没有得到你给出的输出,这正是我想要的,而是“6 5.68094 8.11276 5.52142 7.85285 5.52444 7.45819 5.42587 7.89775 5.23989 7.85335 5.23688
  • 抱歉,这可能难以阅读,我将编辑我的问题以显示输出
  • @user130306 我使用了您提供的输入的确切格式。让我用用于两个文件的输入来更新答案:
  • 嗨!我刚刚意识到,问题出在我的格式上。再次非常感谢您的帮助。
  • 是的,再次感谢你,我会接受你的回答
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-27
  • 2015-12-29
  • 1970-01-01
  • 1970-01-01
  • 2018-08-30
相关资源
最近更新 更多