使用 Python 读取 JSON 个文件的目录和 运行 每个文件的反向 Python 脚本

Using Python to read through a directory of JSON files and run a reversing Python script on each file

我有一个名为 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"}

(所有名字都是虚构的)

大多数文件都非常大,因此手动执行此操作不是一种选择。

我正在尝试反转这些单独文件的内容并将这些反转数据写入新的 'reversed file' 以便上面的 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 时间戳对它们进行反向排序。

用户文件格式为

firstname-secondname1.json

firstname-secondname2.json

firstname-secondname3.json

...

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

我的方法是在 Users 目录上使用 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
        '''

注释行是我刚刚尝试过一些不同的东西的地方,我选择将它们留在其中以说明我的方法。

运行 这给了我以下错误:

Traceback (most recent call last): File "test.py", line 37, in with open(files) as infile: TypeError: coercing to Unicode: need string or buffer, tuple found

根据我对我正在尝试做的事情的理解,os.walk() 应该遍历 Users 目录,并且 'walks over' 每个用户文件我都试图传递这些文件中的每一个转到 with open() 方法打开它,以便我可以对其进行一些处理。

我哪里错了?

反转单个文件

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

我猜?

遍历文件

os.walk return 是 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 到 return 实际上并不是你从 os.walk 得到的东西......实际上它看起来像你做的,但后来注释掉了......你为什么认为给出一个列表open 是正确的做法