结合两个python脚本后令人讨厌的射击

时间:2015-07-26 03:10:46

标签: python python-3.x

这是我的第一个代码。使用此代码,我提取了一个(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

2 个答案:

答案 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