逻辑测试所有值,而不是一个python

时间:2018-12-14 15:38:17

标签: python json python-2.7 list dictionary

所以我有我的函数,该函数实质上检查两组数据中是否都存在特定的文件名。如果这样做,则它将对文件大小进行一些计算,并在终端上输出结果。由于我要传递一个文件名来测试,所以它将开始遍历列表中的每个文件名,直到完成为止。我只想测试文件名'a.json'作为测试。然后,我可以隔离测试“ b.json”和“ c.json”。我当前得到的输出是:

a.json
()
(1000, 1000)
ok
b.json
()
(1000, 1000)
ok
c.json
()
(1000, 1000)
ok

所以伪代码为:

For a.json in file_names
if a.json exists in jsonDatacurrFile
 if  a.json exist in both jsonDataprevFile and jsonDatacurrFile
  use compare function with the filesize from jsonDatacurrFile and jsonDataprevFile for a.json and output whatever condition it meets

因此,示例输出为:

a.json - ok

文件如下:

jsonDataprevFile等于:

{"File Name": "a.json", "File Size": 1000}
{"File Name": "b.json", "File Size": 1000}
{"File Name": "c.json", "File Size": 1000}

jsonDatacurrFile

{"File Name": "a.json", "File Size": 1000}
{"File Name": "b.json", "File Size": 1000}
{"File Name": "c.json", "File Size": 1000}    

我当前的逻辑如下:

def compare(previous,current):
  # temporary for debug
  print()
  print(previous,current)

  tolerance = 0.4

  if previous is None and current is None:
      return "both missing"

  if previous is None:
      return "new"

  if current is None:
      return "missing"

  size_ratio = float(current)/previous

  if size_ratio >= 1 + tolerance:
      return "not ok %d%% bigger" % round(((size_ratio - 1) * 100),0)

  if size_ratio <= 1 - tolerance:
      return "not ok %d%% smaller" % round(((1 - size_ratio) * 100),0)

  return "ok"



def readFileIntoDict(pathOfFile):
  fo = open(pathOfFile, "rw+")
  linesOfFiles = fo.readlines()
  dataInFile = {}
  for line in linesOfFiles:
      jsonD = json.loads(line)
      dataInFile[jsonD['File Name']] = jsonD['File Size']
  return dataInFile

  jsonDataprevFile = readFileIntoDict('dates/2018-01-01.json')
  jsonDatacurrFile = readFileIntoDict('dates/2018-01-02.json')


file_names = ['a.json', 'b.json', 'c.json']
for fileNames in file_names:
    if fileNames in jsonDatacurrFile:
        if jsonDataprevFile[fileNames] == jsonDatacurrFile[fileNames]:
         print fileNames
         print(compare(jsonDataprevFile.get('a.json') , jsonDatacurrFile.get('a.json')))

1 个答案:

答案 0 :(得分:0)

有两点需要帮助。您现在可能会得到奇怪的答案,因为在这一行:

if jsonDataprevFile[fileNames] == jsonDatacurrFile[fileNames]:

您正在比较的是字典(大小)中的值,而不是名称,因此,当两个大小相同时,您仅进入“ if”块。另外,您在调用compare的调用中使用了文字名称“ a.json”。您应该使用fileName变量。

如果您要查找一组特定的名称,一种更清洁的方法是使用dict.keys()方法来获取每个名称的键集,并使用它们上的集合相交来获取通用键。 ..

names_of_interest = {'a.file', 'b.file'}
names_in_both = json_file_a.keys() & json_file_b.keys()
# find names of interest that are in both files...
names = names_of_interest & names_in_both
# now you can just iterate through that set and go to work....
for name in names:
  compare(json_file_a[name], json_file_b[name])

请注意,如果您只想使用所有通用名称,则可以转储感兴趣列表的名称,而只使用键集的交集