使用Python读取JSON文件目录并在每个文件上运行可逆的Python脚本

时间:2016-12-19 21:25:42

标签: python json reverse for-in-loop os.walk

我有一个名为Userss的文件夹,包含~100个单独的JSON文件。每个JSON文件都以以下格式保存有关用户的数据:

{"cX": 298, "cY": 492, "time": 1420209750422, "y": 492, "x": 298, "type": "mousemove", "name": "Anthony Coleman"}
{"cX": 653, "cY": 57, "time": 1420209753241, "y": 57, "x": 653, "type": "mousemove", "name": "Anthony Coleman"}
{"cX": 646, "cY": 53, "time": 1420209753244, "y": 53, "x": 646, "type": "mousemove", "name": "Anthony Coleman"}
{"cX": 640, "cY": 50, "time": 1420209753250, "y": 50, "x": 640, "type": "mousemove", "name": "Anthony Coleman"}

(所有名字都已组成)

大多数文件非常大,因此不能手动执行此操作。

我正在尝试撤消这些单个文件的内容,并将此反转数据写入新的“反向文件”中。以便上面的JSON代码段显示为

{"cX": 640, "cY": 50, "time": 1420209753250, "y": 50, "x": 640, "type": "mousemove", "name": "Anthony Coleman"}
{"cX": 646, "cY": 53, "time": 1420209753244, "y": 53, "x": 646, "type": "mousemove", "name": "Anthony Coleman"}
{"cX": 653, "cY": 57, "time": 1420209753241, "y": 57, "x": 653, "type": "mousemove", "name": "Anthony Coleman"}
{"cX": 298, "cY": 492, "time": 1420209750422, "y": 492, "x": 298, "type": "mousemove", "name": "Anthony Coleman"}

在一个新文件中,基本上按Unix时间戳对它们进行反向排序。

用户文件的格式为

  

姓名-secondname1.json

     

姓名-secondname2.json

     

姓名-secondname3.json

     

...

FYP是保存运行脚本(test.py)的文件夹,Userss是保存用户数据的文件夹。用户是FYP的子文件夹。

我的方法是在Userss目录中使用os.walk()并执行我在每个文件中提出的反转脚本。我的问题实际上是首先遍历目录并读取文件。

以下代码就是我所拥有的:

test.py

import os
from operator import itemgetter, attrgetter, methodcaller
import json

rootdir = './Userss'

fileHandles = {}
count = 0
totalfilelines = 0
filenum = 0
lastName=None
handle=None

for files in os.walk(rootdir):
    #print files
    #print "---------"
    #print len(files)
    #for file in files:
    filenum += 1

    with open(files) as infile:
        #for line in sortedpython(infile, key=itemgetter(2), reverse=True):
        for line in infile:
        '''
        reversing script here
        '''

评论的行是我刚刚尝试了一些不同的东西,我选择让他们留下来了解我的方法。

运行此命令会出现以下错误:

  

回溯(最近一次呼叫最后一次):文件" test.py",第37行,in          open(files)as infile:TypeError:强制转换为Unicode:需要字符串或缓冲区,找到元组

根据我对我尝试做的事情的理解,os.walk()应该遍历“用户”目录,并且随着它“走过去”。每个用户文件我试图将这些文件中的每一个传递给with open()方法以打开它,以便我可以对其进行一些工作。

我在哪里错了?

1 个答案:

答案 0 :(得分:0)

倒转单个文件

with open(newFile,"wb") as f:
     f.write("\n".join(reversed(list(open("oldFile.txt","rb"))))

我想?

迭代文件

os.walk返回current_directory,directories_in_cwd,files_in_cwd的元组,而不仅仅是文件路径...而且单个文件只是文件名,它不是文件的路径(绝对的或相对的)

for curent_directory,directories,files in os.walk(rootdir):
     for file in files:
         filePath = os.path.join(current_directory,file)
         with open(filePath,"rb") as oldFile: 
              ....

或者它可能更容易做

import glob
for filePath in glob.glob("/path/to/*.json"):
    with open(filePath,"rb") as oldFile:
         #do something i guess? ...

可能会解决您的问题...虽然真的这更多是关于调试您的程序。添加一个简单的print(file)会向您显示您期望os.walk到返回实际上并不是你从os.walk回来的......实际上它看起来像你做了,但后来评论出来了......为什么你认为给open列表是正确的要做的事