这是我的第一个代码。使用此代码,我提取了一个(6800)随机元素列表,并将我的结果保存为文本文件。 (此代码正在读取的文件超过10,000行,所以每次运行它时,我都会得到一组新的随机元素。)
import random
with open('filename.txt') as fin:
lines = fin.readlines()
random.shuffle(lines)
for i, line in enumerate(lines):
if i >= 0 and i < 6800:
print(line, end='')
这是我的第二个代码。使用上一步中保存的文本文件,然后我使用此代码将文件与另一个文本文件进行比较。我的结果如您所见,是计数;总是变化的,例如2390或4325等。
import csv
with open ("SavedTextFile_RandomElements.txt") as f:
dict1 = {}
r = csv.reader(f,delimiter="\t")
for row in r:
a, b, v = row
dict1.setdefault((a,b),[]).append(v)
#for key in dict1:
#print(key[0])
#print(key[1])
#print(d[key][0]])
with open ("filename2.txt") as f:
dict2 = {}
r = csv.reader(f,delimiter="\t")
for row in r:
a, b, v = row
dict2.setdefault((a,b),[]).append(v)
#for key in dict2:
#print(key[0])
count = 0
for key1 in dict1:
for key2 in dict2:
if (key1[0] == key2[0]) and abs((float(key1[1].split(" ")[0])) - (float(key2[1].split(" ")[0]))) < 10000:
count += 1
print(count)
我决定将两者结合起来,因为我想跳过提取和保存过程,只需让第一个代码直接进入第二个代码,自动读取随机元素。以下是两个组合:
import csv
import random
with open('filename.txt') as fin:
lines = fin.readlines()
random.shuffle(lines)
str_o = " "
for i, line in enumerate(lines):
if i >= 0 and i < 6800:
str_o += line
r = str_o
dict1 = {}
r = csv.reader(fin,delimiter="\t")
for row in r:
a, b, v = row
dict1.setdefault((a,b),[]).append(v)
with open ("filename2.txt") as f:
dict2 = {}
r = csv.reader(f,delimiter="\t")
for row in r:
a, b, v = row
dict2.setdefault((a,b),[]).append(v)
count = 0
for key1 in dict1:
for key2 in dict2:
if (key1[0] == key2[0]) and abs((float(key1[1].split(" ")[0])) - (float(key2[1].split(" ")[0]))) < 1000:
count += 1
print(count)
然而,现在当我运行代码时。我总是得到0.即使我改变(不到一千):
< 1000:
例如(少于一万):
< 10000:
我只收到零数。当我写的当然小于零时,我应该只收到零的数:
< 0:
但无论我输入什么号码,我总是得到零。我在某个地方出了问题。你能帮我弄清楚那是哪个吗?我很乐意澄清任何事情。
[编辑] 我的两个文件都采用以下格式:
1 10045 0.120559958
1 157465 0.590642951
1 222471 0.947959795
1 222473 0.083341617
1 222541 0.054014337
1 222588 0.060296547
答案 0 :(得分:0)
你想要合并这两个代码,所以你真的不需要从SavedTextFile_RandomElements.txt中读取,对吗?
在这种情况下,您需要从某处读取,我认为您打算将它们存储在变量'r'中。但你用这个覆盖'r':
r = csv.reader(fin,delimiter="\t")
顺便说一下,那条线上面有2行错字吗?你没有'fin'的任何文件打开声明。上述组合代码必须无法正常运行(抛出异常)。
要修复,只需删除csv.reader行,就像这样(并减少缩进开始dict1 = {}
r = str_o
dict1 = {}
for row in r:
a, b, v = row.split()
dict1.setdefault((a,b),[]).append(v)
编辑:另一个问题,导致ValueError异常 我之前错过了这个。您将整个文件内容连接成一个字符串,但稍后在r上循环读取每一行并将其分解为a,b,v。
解包的错误来自于这个循环,因为你循环遍历单个字符串,这意味着每个循环得到每个字符,而不是每一行。
要解决此问题,您只需要一个列表'r',不需要字符串:
r = []
for i, line in enumerate(lines):
if i >= 0 and i < 6800:
r.append(line)
dict1 = {}
for row in r:
a, b, v = row.split()
dict1.setdefault((a,b),[]).append(v)
编辑:读取“行”或行变换 由于输入文件逐行拆分为由空格分隔的字符串,因此需要拆分'row'var:
a, b, v = row.split()
答案 1 :(得分:0)
不能告诉你哪里出错了。在您的组合代码中:
str_o
并将其分配给r
,但您永远不会使用它csv.reader
分配给r
- 很难从缩进中判断出这是否仍在with
区块内。你想做这样的事情(我没有使用csv模块):
import collections, random
d1 = collections.defaultdict(list)
d2 = collections.defaultdict(list)
with open('filename.txt') as fin:
lines = fin.readlines()
lines = random.sample(lines, 6800)
for line in lines:
line = line.strip()
try:
a, b, v = line.split('\t')
d1[(a,b)].append(v)
except ValueError as e:
print 'Error:' + line
with open ("filename2.txt") as f:
for line in f:
line = line.strip()
try:
a, b, v = line.split('\t')
d2[(a,b)].append(v)
except ValueError as e:
print 'Error:' + line