Использование Python для чтения каталога файлов JSON и запуска реверсивного скрипта Python для каждого файла.

У меня есть папка 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.

Файл Userss имеет формат

имя-второе имя1.json

имя-отчество2.json

имя-отчество3.json

...

FYP — это папка, в которой сохраняется запускаемый скрипт (test.py), а Userss — это папка, в которой сохраняются пользовательские данные. Userss — это подпапка FYP.

Мой подход заключается в использовании os.walk() в каталоге Userss и выполнении реверсивного сценария, который я придумал для каждого файла. Моя проблема на самом деле заключается в переборе каталога и чтении файлов, в первую очередь.

Следующий код - это то, что у меня есть:

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, с открытым (файлы) в качестве входного файла: TypeError: принуждение к Unicode: нужна строка или буфер, кортеж найден

Насколько я понимаю, что я пытаюсь сделать, os.walk() должен проходить через каталог Userss, и когда он «обходит» каждый пользовательский файл, я пытаюсь передать каждый из этих файлов методу with open(), чтобы открыть его, чтобы я может немного поработать над ним.

Где я ошибаюсь?


person Dyland    schedule 19.12.2016    source источник


Ответы (1)


реверсирование одного файла

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 было правильным решением

person Joran Beasley    schedule 19.12.2016
comment
Может быть, тонкий вопрос заключается в том, что то же самое, что и сортировка по отметке времени в обратном порядке в сценарии OP? - person quapka; 20.12.2016
comment
Реверс не проблема для меня в минуту, я думаю, что у меня есть способ сделать это. Я не могу попробовать это, пока не смогу прочитать файлы, так что это моя проблема. - person Dyland; 20.12.2016