我有一个名为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()
并执行我在每个文件中提出的反转脚本。我的问题实际上是首先遍历目录并读取文件。
以下代码就是我所拥有的:
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()
方法以打开它,以便我可以对其进行一些工作。
我在哪里错了?
答案 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
列表是正确的要做的事