Python 字符串操作和基于它们所在的行添加值

Python 字符串操作和基于它们所在的行添加值,python,string,python-2.7,Python,String,Python 2.7,我有一个文件文本分隔的文件,我试图使每行二进制组合,并给每对线的行数 下面是一个示例(如果您愿意,也可以在这里下载) 我想要这样的 A_1 B_1 AFD_2 DNGS_2 AFD_2 SGDH_2 DNGS_2 SGDH_2 NHYG_3 QHD_3 NHYG_3 lkd_3 NHYG_3 uyete_3 QHD_3 lkd_3 QHD_3 uyete_3 lkd_3 uyete_3 AFD_4 TTT_4 这意味着,A_1和B_1来自第一排 AFD_

我有一个文件文本分隔的文件,我试图使每行二进制组合,并给每对线的行数

下面是一个示例(如果您愿意,也可以在这里下载)

我想要这样的

A_1     B_1
AFD_2   DNGS_2
AFD_2   SGDH_2
DNGS_2  SGDH_2
NHYG_3  QHD_3
NHYG_3  lkd_3
NHYG_3  uyete_3
QHD_3   lkd_3
QHD_3   uyete_3
lkd_3   uyete_3
AFD_4   TTT_4
这意味着,A_1和B_1来自第一排 AFD_2和DNG_2来自第二排等

我已经试过了,但我想不出来

#!/usr/bin/python
import itertools
# make my output
out = {}
# give a name to my data 
file_name = 'data.txt'
# read all the lines 
for n, line in enumerate(open(file_name).readlines()):
    # split each line by comma
    item1 = line.split('\t')
    # split each stirg from another one by a comma
    item2 = item1.split(',')
    # iterate over all combinations of 2 strings
    for i in itertools.combinations(item2,2):
        # save the data into out 
        out.write('\t'.join(i))
输出答案1 答复2 试试这个

#!/usr/bin/python
from itertools import combinations

with open('data1.txt') as f:
    result = []
    for n, line in enumerate(f, start=1):
        items = line.strip().split(',')

        x = [['%s_%d' % (x, n) for x in item] for item in combinations(items, 2)]
        result.append(x)

for res in result:
    for elem in res:
        print(',\t'.join(elem))
您需要一个列表列表来表示每一对。您可以使用循环中的列表来构建它们

我不确定您想要什么作为您的实际输出格式,但这会打印您的预期输出

如果输入文件中有引号,则简单的修复是

items = line.replace("\"", "").strip().split(',')
对于上述代码。如果数据中有其他双引号,则会中断。所以,如果你知道这不好

否则,创建一个小函数来去除引号。此示例还写入文件

#!/usr/bin/python
from itertools import combinations

def remquotes(s):
    beg, end = 0, len(s)
    if s[0] == '"': beg = 1
    if s[-1] == '"': end = -1
    return s[beg:end]

with open('data1.txt') as f:
    result = []
    for n, line in enumerate(f, start=1):
        items = remquotes(line.strip()).strip().split(',')

        x = [['%s_%d' % (x, n) for x in item] for item in combinations(items, 2)]
        result.append(x)

with open('out.txt', 'w') as fout:
    for res in result:
        for elem in res:                
            linestr = ',\t'.join(elem)
            print(linestr)
            fout.write(linestr + '\n')
试试这个

#!/usr/bin/python
from itertools import combinations

with open('data1.txt') as f:
    result = []
    for n, line in enumerate(f, start=1):
        items = line.strip().split(',')

        x = [['%s_%d' % (x, n) for x in item] for item in combinations(items, 2)]
        result.append(x)

for res in result:
    for elem in res:
        print(',\t'.join(elem))
您需要一个列表列表来表示每一对。您可以使用循环中的列表来构建它们

我不确定您想要什么作为您的实际输出格式,但这会打印您的预期输出

如果输入文件中有引号,则简单的修复是

items = line.replace("\"", "").strip().split(',')
对于上述代码。如果数据中有其他双引号,则会中断。所以,如果你知道这不好

否则,创建一个小函数来去除引号。此示例还写入文件

#!/usr/bin/python
from itertools import combinations

def remquotes(s):
    beg, end = 0, len(s)
    if s[0] == '"': beg = 1
    if s[-1] == '"': end = -1
    return s[beg:end]

with open('data1.txt') as f:
    result = []
    for n, line in enumerate(f, start=1):
        items = remquotes(line.strip()).strip().split(',')

        x = [['%s_%d' % (x, n) for x in item] for item in combinations(items, 2)]
        result.append(x)

with open('out.txt', 'w') as fout:
    for res in result:
        for elem in res:                
            linestr = ',\t'.join(elem)
            print(linestr)
            fout.write(linestr + '\n')

与提供的另一个答案类似,根据注释添加的内容,看起来您实际上希望写入以制表符分隔的文本文件,而不是字典

#!/usr/bin/python
import itertools

file_name = 'data.txt'
out_file = 'out.txt'

with open(file_name) as infile, open(out_file, "w") as out:
  for n,line in enumerate(infile):
    row = [i + "_" + str(n+1) for i in line.strip().split(",")]
    for i in itertools.combinations(row,2):
      out.write('\t'.join(i) + '\n')

与提供的另一个答案类似,根据注释添加的内容,看起来您实际上希望写入以制表符分隔的文本文件,而不是字典

#!/usr/bin/python
import itertools

file_name = 'data.txt'
out_file = 'out.txt'

with open(file_name) as infile, open(out_file, "w") as out:
  for n,line in enumerate(infile):
    row = [i + "_" + str(n+1) for i in line.strip().split(",")]
    for i in itertools.combinations(row,2):
      out.write('\t'.join(i) + '\n')

以下代码似乎只需很少的代码:

import itertools

input_filename = 'data.txt'
output_filename = 'split_data.txt'

with open(input_filename, 'rt') as inp, open(output_filename, 'wt') as outp:
    for n, line in enumerate(inp, 1):
        items = ('{}_{}'.format(x.strip(), n) 
                    for x in line.replace('"', '').split(','))
        for combo in itertools.combinations(items, 2):
            outp.write('\t'.join(combo) + '\n')

以下代码似乎只需很少的代码:

import itertools

input_filename = 'data.txt'
output_filename = 'split_data.txt'

with open(input_filename, 'rt') as inp, open(output_filename, 'wt') as outp:
    for n, line in enumerate(inp, 1):
        items = ('{}_{}'.format(x.strip(), n) 
                    for x in line.replace('"', '').split(','))
        for combo in itertools.combinations(items, 2):
            outp.write('\t'.join(combo) + '\n')


这里有很多混乱。首先,为什么要拆分标签页?您希望输入文件中的选项卡在哪里?此外,您似乎正在尝试将写入词典。你打算有一个输出文件吗?@Paul Rooney很抱歉搞混了。我试着把线彼此分开,这就是为什么我使用这个标签,也许我错了?我只想写输出,我将修改上面的行由换行符分隔,即
\n
。你的
splitlines
函数应该解决这个问题。@Paul Rooney所以如果你的输入文件中有双引号,请给我一个解决方案?这里有很多混乱。首先,为什么要拆分标签页?您希望输入文件中的选项卡在哪里?此外,您似乎正在尝试将写入词典。你打算有一个输出文件吗?@Paul Rooney很抱歉搞混了。我试着把线彼此分开,这就是为什么我使用这个标签,也许我错了?我只想写输出,我将修改上面的行由换行符分隔,即
\n
。你的
splitlines
函数应该解决这个问题。@Paul Rooney所以如果你的输入文件中有双引号,请给我一个解决方案?看上面,我发布了输出,它看起来怎么样,我再次保存了xls中的数据,似乎有双引号。我的回答是基于引号消失的假设。我可以直接从
xlsx
读取它们吗?它们都在第一页和第一列中。有用于读取xlsx的python库。你可以尝试使用它们。这是非常奇怪的,因为有时它把价值,有时它没有!!!当我使用较大的数据时。在任何情况下,我如何将其写入文件?看上面,我发布了输出,它看起来如何,我再次保存了xls的数据,似乎有双引号。确定我的答案是基于引号消失的假设。我可以直接从
xlsx
读取它们吗?它们都在第一页和第一列中。有用于读取xlsx的python库。你可以尝试使用它们。这是非常奇怪的,因为有时它把价值,有时它没有!!!当我使用较大的数据时。在任何情况下,我如何将其写入文件?我粘贴了上面您答案的输出,这与我希望的结果并不完全相同。如果您的文件中实际包含
”,则使用
line.strip(“”).strip().split(“,”)
从底部开始的第三行抱歉,使用
行。替换(“\”,”).strip().split(“,”)
正如@Paul RooneyI提供的那样,粘贴了上面你答案的输出,这与我希望的不完全一样。如果你的文件中确实有
”,那么使用
line.strip(“”).strip().split(“,”)
从底部开始的第三行道歉,使用
行。替换(“\”,”).strip().split(“,”)
由@Paul Rooney提供