Python 如何从字符串生成唯一的数据

Python 如何从字符串生成唯一的数据,python,Python,我有这样的数据。字符串用逗号分隔 "India1,India2,myIndia " "Where,Here,Here " "Here,Where,India,uyete" "AFD,TTT" 我想做的是把它们放在一列中(一列在另一列下),这样就会变成这样 India1 India2 myIndia Where Here Here Here Where India uyete AFD TTT 然后,我保留了导致这种情况的独特因素 India1 India2 myIndia Wher

我有这样的数据。字符串用逗号分隔

"India1,India2,myIndia     "
"Where,Here,Here   "
"Here,Where,India,uyete"
"AFD,TTT"
我想做的是把它们放在一列中(一列在另一列下),这样就会变成这样

India1
India2
myIndia
Where
Here
Here
Here
Where
India
uyete
AFD
TTT
然后,我保留了导致这种情况的独特因素

India1
India2
myIndia
Where
Here
India
uyete
AFD
TTT
因此,我有一个.txt格式的第一个数据,我尝试使用numpy来实现这一点

这是我的密码

#!/usr/bin/python
import numpy as np

# give a name to my data 
file_name = 'path to my data/test.txt'
# set my output 
with open ( 'output.txt' , 'w' ) as out:
    # read all the lines
    for n , line in enumerate ( open ( file_name ).readlines ( ) ):
        # split each stirg from another one by a comma
        item1 = file_name.split ( ',' )
    myList = ','.join ( map ( str , item1 ) )
    item2 = np.unique ( myList , return_inverse=True )
    # save the data into out
    out.write ( item2 )
我得到了
TypeError:需要一个字符缓冲区对象

我已经搜索过了,发现了几个类似的帖子

如果我添加了
out.seek(0)
我仍然会得到相同的错误

但是,通过将其更改为
out.write(str(item2))
感谢我没有收到任何错误,但是,输出显示了这一点

(数组(['/path到文件/test.txt'], 数据类型='| S29'),数组([0]))

下面是我尝试使用的解决方案

import csv

data = []
def remove_quotes(file):
    for line in file:
        yield line.strip ( '"\n' )
with open ( 'test.txt' ) as f:
    reader = csv.reader ( remove_quotes ( f ) )
    for row in reader:
        data.extend ( row )

没有错误,但数据也不会生成

为什么使用numpy???我不确定是否要使用与输入和输出相同的文件

#!/usr/bin/env python


# give a name to my data 
inputData = """India1,India2,myIndia
Where,Here,Here   
Here,Where,India,uyete
AFD,TTT"""

# if you want to read the data from a file
#inputData = open(fileName, 'r').readlines()

outputData = ""
tempData = list()
for line in inputData.split("\n"):
    lineStripped = line.strip()
    lineSplit = lineStripped.split(',')
    lineElementsStripped = [element.strip() for element in lineSplit]
    tempData.extend( lineElementsStripped )
tempData = set(tempData)
outputData = "\n".join(tempData)
print("\nInputdata: \n%s" % inputData)
print("\nOutputdata: \n%s" % outputData)

听起来你可能有一个csv文件。你不需要numpy,附带的电池就是你所需要的

 import csv

 data = []
 with open('test.txt') as f:
     reader = csv.reader(f)
     for row in reader:
         data.extend(row)
您可以
。扩展
列表,而不是
。向列表追加
。基本上就像说

for thing in row:
    data.append(thing)
不过,这仍然会留下副本。如果您不关心订单,您可以将其设置为
集合
并调用
更新()
,而不是扩展:

 data = set()
 with open('test.txt') as f:
     reader = csv.reader(f)
     for row in reader:
         data.extend(row)
现在一切都是独一无二的。但是,如果你关心顺序,你就必须把事情过滤下来:

unique_data = []
for thing in data:
    if thing not in unique_data:
        unique_data.append(thing)
如果
test.txt
文件包含以下文本:

"India1,India2,myIndia     "
"Where,Here,Here   "
"Here,Where,India,uyete"
"AFD,TTT"
而不是

India1,India2,myIndia     
Where,Here,Here   
Here,Where,India,uyete
AFD,TTT
那你就没有一个csv了。您可以修复生成csv的内容,或者手动删除引号,或者动态修复

def remove_quotes(file):
    for line in file:
        yield line.strip('"\n')

reader = csv.reader(remove_quotes(f))

下面的
stack.txt
包含以下内容:

"India1,India2,myIndia"
"Where,Here,Here"
"Here,Where,India,uyete"
"AFD,TTT"
给你:

from collections import OrderedDict

with open("stack.txt", "r") as f:
    # read your data in from the gist site and strip off any new-line characters
    data = [eval(line.strip()) for line in f.readlines()]
    # get individual words into a list
    individual_elements = [word for row in data for word in row.split(",")]
    # remove duplicates and preserve order
    uniques = OrderedDict.fromkeys(individual_elements)   
    # convert from OrderedDict object to plain list
    final = [word for word in uniques]

print(final)
这就产生了:

['India1', 'India2', 'myIndia', 'Where', 'Here', 'India', 'uyete', 'AFD', 'TTT']
India1
India2
myIndia
Where
Here
India
uyete
AFD
TTT
编辑:要获得所需的输出,只需按所需格式打印列表:

print("\n".join(final))
从输出的角度来看,这相当于:

for x in final:
    print(x)
这就产生了:

['India1', 'India2', 'myIndia', 'Where', 'Here', 'India', 'uyete', 'AFD', 'TTT']
India1
India2
myIndia
Where
Here
India
uyete
AFD
TTT

您只需从文件中读取、拆分并将所有内容放在一个集合中。
file\u name.split(',')
。您希望它做什么?请参阅文档部分中的
unique\u everseed
。@cricket\u 007我希望用
comma
@nik拆分字符串。为什么要拆分文件名?维护顺序重要吗?在提供答案之前,您可能需要对问题进行澄清。没有明确要求的所有内容对我来说都不重要。类似于来自集合导入订单的
;tempData=OrderedDict.fromkeys(tempData).keys()应该保留顺序。@not_a_机器人这是什么?
tempData
@JDB顺序对我很重要。看看我上面的问题。我展示了输出的外观您的文件是否包含
“foo,bar,thing,qux”\n“下一行,goes,here”\n
?如果是这样的话,你会想修复你的csv或包装文件。是的,我在这里分享一个例子,顺便说一句,引号包括在文件中,显然。。。OP提出了多个问题,包括这个data@nik那么你肯定想要
remove\u quotes
包装器。@Wayne Werner最后一个
remove\u quotes放在哪里?
我的意思是将remove\u quotes与你给出的第一个解决方案合并,如何将读者传递给它?我已经喜欢你的答案了!只有一件事,是否可以将输出作为一列,而不在另一列下放置任何
?如果是这样,我接受并喜欢您的答案
final
是一个
列表
对象,因此它有
字符分隔其字符串元素。将更新。