python 仅从json文件中提取id并将其读入CSV文件

tf7tbtn2  于 2023-06-28  发布在  Python
关注(0)|答案(3)|浏览(147)

我有一个包含多个JSON文件的文件夹。下面是一个示例JSON文件(所有JSON文件具有相同的结构):

{
   "url": "http://www.lulu.com/shop/alfred-d-byrd/in-the-fire-of-dawn/paperback/product-1108729.html", 
   "label": "true", 
   "body": "SOME TEXT HERE",
   "ids": [
       "360175950098468864",  
       "394147879201148929"
   ]
}

**我只想提取ids并将其写入CSV文件。**以下是我的代码:

import pandas as pd
import os
from os import path
import glob
import csv
import json

input_path = "TEST/True_JSON"
for file in glob.glob(os.path.join(input_path,'*.json')):
    with open(file,'rt') as json_file:
        json_data = pd.read_json(json_file)  #reading json into a pandas dataframe
        ids = json_data[['ids']] #select only "response_tweet_ids" 
        ids.to_csv('TEST/ids.csv',encoding='utf-8', header=False, index=False)

print(ids)

问题:上面的代码将一些id写入CSV文件。但是,它不会返回所有的ID。此外,输出CSV文件(ids.csv)中有一些id在我的任何JSON文件中都不存在!

oewdyzsn

oewdyzsn1#

另一种方法是为文件夹中的所有ID创建公共列表,并仅将其写入输出文件一次,此处示例:

input_path = "TEST/True_JSON"
**ids = []**
for file in glob.glob(os.path.join(input_path,'*.json')):
    with open(file,'rt') as json_file:
        json_data = pd.read_json(json_file)  #reading json into a pandas dataframe
        **ids.extend(json_data['ids'].to_list()) #select only "response_tweet_ids" 

pd.DataFrame(
    ids, colums=('ids', )
).to_csv('TEST/ids.csv',encoding='utf-8', header=False, index=False)**

print(ids)

请阅读@lemonhead的answer以获取更多详细信息。

hiz5n14c

hiz5n14c2#

我认为你有两个主要问题:

  1. pandas在某些情况下似乎读取id off-by-1,这可能是由于内部读取为float,然后转换为int64和floor。有关遇到的类似问题,请参见here
    要查看此内容,请执行以下操作:
> x = '''
{
   "url": "http://www.lulu.com/shop/alfred-d-byrd/in-the-fire-of-dawn/paperback/product-1108729.html", 
   "label": "true", 
   "body": "SOME TEXT HERE",
   "ids": [
       "360175950098468864",  
       "394147879201148929"
   ]
}
'''
> print(pd.read_json(io.StringIO(x)))

# outputs: 
                                                 url label            body                 ids
0  http://www.lulu.com/shop/alfred-d-byrd/in-the-...  true  SOME TEXT HERE  360175950098468864
1  http://www.lulu.com/shop/alfred-d-byrd/in-the-...  true  SOME TEXT HERE  394147879201148928

注意394147879201148929的关闭一个错误! AFAIK,在你的例子中避免这种情况的一个快速方法就是告诉pandas以字符串的形式读取所有内容,例如:

pd.read_json(json_file, dtype='string')

1.您正在循环访问json文件,并将每个文件写入同一个csv文件。但是,默认情况下,pandas是以'w'模式打开文件,这将覆盖文件中以前的任何数据。如果您以追加模式('a')打开,那么应该会达到您的预期效果

ids.to_csv('TEST/ids.csv',encoding='utf-8', header=False, index=False, mode='a')

在上下文中:

for file in glob.glob(os.path.join(input_path,'*.json')):
    with open(file,'rt') as json_file:
        json_data = pd.read_json(json_file, dtype='string')  #reading json into a pandas dataframe
        ids = json_data[['ids']] #select only "response_tweet_ids" 
        ids.to_csv('TEST/ids.csv',encoding='utf-8', header=False, index=False, mode='a')

总的来说,除非你在这里从pandas中获得其他东西,为什么不直接使用原始jsoncsv库呢?下面的代码将在没有pandas依赖项的情况下执行相同的操作:

import os
from os import path
import glob
import csv
import json

input_path = "TEST/True_JSON"
all_ids = []
for file in glob.glob(os.path.join(input_path,'*.json')):
    with open(file,'rt') as json_file:
        json_data = json.load(json_file)
        ids = json_data['ids']
        all_ids.extend(ids)

print(all_ids)

# write all ids to a csv file
# you could also remove duplicates or other post-processing at this point
with open('TEST/ids.csv', mode='wt', newline='') as fobj:
    writer = csv.writer(fobj)
    for row in all_ids:
        writer.writerow([row])
3mpgtkmj

3mpgtkmj3#

默认情况下,dataframe.to_csv()会覆盖该文件。因此,每次执行循环时,您都将该文件替换为该输入文件中的ID,最终结果是最后一个文件中的ID。
使用mode='a'参数追加到CSV文件,而不是覆盖。

ids.to_csv(
    'TEST/ids.csv', encoding='utf-8', header=False, index=False,
    **mode='a'**
)

相关问题