使用 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
是正确的做法
我有一个名为 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
是正确的做法