在Python/NumPy中删除文件中的所有重复行
我的问题是删除两个重复的行。我有一个文本文件:在Python/NumPy中删除文件中的所有重复行,python,numpy,Python,Numpy,我的问题是删除两个重复的行。我有一个文本文件: 192.168.1.18 --- B8:27:EB:48:C3:B6 192.168.1.12 --- 00:A0:57:2E:A6:12 192.168.1.11 --- 00:1D:A2:80:3C:CC 192.168.1.7 --- F0:9F:C2:0A:48:E7 192.168.1.6 --- 80:2A:A8:C9:85:1C 192.168.1.1 --- F0:9F:C2:05:B7:A6 192.168.1.9 --- DC:
192.168.1.18 --- B8:27:EB:48:C3:B6
192.168.1.12 --- 00:A0:57:2E:A6:12
192.168.1.11 --- 00:1D:A2:80:3C:CC
192.168.1.7 --- F0:9F:C2:0A:48:E7
192.168.1.6 --- 80:2A:A8:C9:85:1C
192.168.1.1 --- F0:9F:C2:05:B7:A6
192.168.1.9 --- DC:4A:3E:DF:22:06
192.168.1.8 --- 80:2A:A8:C9:8E:F6
192.168.1.1 --- F0:9F:C2:05:B7:A6
192.168.1.7 --- F0:9F:C2:0A:48:E7
192.168.1.12 --- 00:A0:57:2E:A6:12
192.168.1.11 --- 00:1D:A2:80:3C:CC
192.168.1.6 --- 80:2A:A8:C9:85:1C
192.168.1.8 --- 80:2A:A8:C9:8E:F6
文本文件与它的外观完全相同。请帮助我,我想删除两个重复的行,使其只保留:
192.168.1.18 --- B8:27:EB:48:C3:B6
192.168.1.9 --- DC:4A:3E:DF:22:06
谢谢你们的帮助。问题中没有太多细节,您已经标记了
numpy
,这是一个要求还是一个兴趣
如果没有具体要求,请使用标准库:
d = {}
with open('/file/path', 'r') as f:
for line in f:
if line not in d:
d[line] = 1
else:
d[line] += 1
no_dup = [line for line in d if d[line] < 2]
d={}
将open('/file/path',r')作为f:
对于f中的行:
如果行不在d中:
d[行]=1
其他:
d[行]+=1
如果d[line]<2,则无_dup=[line for line in d]
问题中没有太多细节,您已经标记了numpy
,这是一个要求还是一个兴趣
如果没有具体要求,请使用标准库:
d = {}
with open('/file/path', 'r') as f:
for line in f:
if line not in d:
d[line] = 1
else:
d[line] += 1
no_dup = [line for line in d if d[line] < 2]
d={}
将open('/file/path',r')作为f:
对于f中的行:
如果行不在d中:
d[行]=1
其他:
d[行]+=1
如果d[line]<2,则无_dup=[line for line in d]
选项1使用
numpy
首先,用np.loadtxt
加载文件
接下来,将np.unique
与return\u counts=True
一起使用,并查找所有未重复的唯一条目
unique, counts = np.unique(x, return_counts=True)
out = unique[counts == 1]
out
array(['192.168.1.18 --- B8:27:EB:48:C3:B6',
'192.168.1.9 --- DC:4A:3E:DF:22:06'],
dtype='<U34')
要保存到文本,您可以使用pd.To\u csv
:
选项1
使用
numpy
首先,用np.loadtxt
加载文件
接下来,将np.unique
与return\u counts=True
一起使用,并查找所有未重复的唯一条目
unique, counts = np.unique(x, return_counts=True)
out = unique[counts == 1]
out
array(['192.168.1.18 --- B8:27:EB:48:C3:B6',
'192.168.1.9 --- DC:4A:3E:DF:22:06'],
dtype='<U34')
要保存到文本,您可以使用pd.To\u csv
:
另一个简短的选择是
集合。计数器对象:
import collections
with open('lines.txt', 'r') as f:
for k,c in collections.Counter(f.read().splitlines()).items():
if c == 1:
print(k)
输出:
192.168.1.18 --- B8:27:EB:48:C3:B6
192.168.1.9 --- DC:4A:3E:DF:22:06
另一个简短的选择是集合。计数器对象:
import collections
with open('lines.txt', 'r') as f:
for k,c in collections.Counter(f.read().splitlines()).items():
if c == 1:
print(k)
输出:
192.168.1.18 --- B8:27:EB:48:C3:B6
192.168.1.9 --- DC:4A:3E:DF:22:06
如上所述,你可以使用熊猫。Numpy还具有独特的删除重复项的功能。如上所述,您可以使用Pandas。Numpy还具有用于删除重复项的unique
功能。这也不是Numpy…@cᴏʟᴅsᴘᴇᴇᴅ 是的,我知道。不幸的是,我没有太多的经验。虽然在帖子中对其进行了标记,但我没有看到针对该库的特定解决方案的特定请求。如果你可以简单地用标准库来做,为什么不呢?@cᴏʟᴅsᴘᴇᴇᴅ, 完全在numpy上做这件事不是强制性的。主要的标记是python
,python3
,…
@shash678在您的例子中,答案无论如何都是不正确的。但一般来说,你不应该对这样的事情做出假设。请OP澄清。@cᴏʟᴅsᴘᴇᴇᴅ 说得对。因此,我做了一次编辑,要求OP澄清,但现在仍然保留我的解决方案。这也不是numpy…@cᴏʟᴅsᴘᴇᴇᴅ 是的,我知道。不幸的是,我没有太多的经验。虽然在帖子中对其进行了标记,但我没有看到针对该库的特定解决方案的特定请求。如果你可以简单地用标准库来做,为什么不呢?@cᴏʟᴅsᴘᴇᴇᴅ, 完全在numpy上做这件事不是强制性的。主要的标记是python
,python3
,…
@shash678在您的例子中,答案无论如何都是不正确的。但一般来说,你不应该对这样的事情做出假设。请OP澄清。@cᴏʟᴅsᴘᴇᴇᴅ 说得对。因此,我做了一次编辑,要求OP澄清,但现在仍然保留了我的解决方案。您只需将文件对象f
传递给计数器,而不是先对其执行读取().splitlines()
。@Blckknght,不,这不起作用,因为中间为空lines@RomanPerekhrest非常感谢。你的答案就是我一直在寻找的:)@A.Babik,你是welcome@RomanPerekhrest我现在想知道如何检测文本文件中的更改。示例:如果上次读取时有新行。有什么想法吗?你可以把文件对象f
传递给计数器
,而不是先对其执行read().splitlines()
。@Blckknght,不,这不起作用,因为中间为空lines@RomanPerekhrest非常感谢。你的答案就是我一直在寻找的:)@A.Babik,你是welcome@RomanPerekhrest我现在想知道如何检测文本文件中的更改。示例:如果上次读取时有新行。有什么想法吗?谢谢你的回答:“A.A. Babik注意到你有能力,所以,请考虑做这件事。”CaldFufft说:“谢谢你的回答。”A.Babik你只能接受一个。我希望你确定你接受了你想要的(我也收到了通知,这就是为什么我问)@COLDSPEED我希望我能接受这两个,因为两个答案都是正确的。我已经接受了一个最干净的输出。谢谢你的回答:“@ A.Babik注意到你有能力,所以,请考虑做它。”CaldFEEST制作:)谢谢你的回答。@ A.Babik你只能接受一个。我希望你确定你接受了你想要的(我也收到了通知,这就是为什么我问)@COLDSPEED我希望我能接受这两个,因为两个答案都是正确的。我已经接受了一个最干净的输出。