读取JSON文件,将嵌套列表写入CSV文件

7xllpg7q  于 2023-07-31  发布在  其他
关注(0)|答案(3)|浏览(113)
    • 我们不允许将任何模块导入Python中,除非在Prompt中允许**

我在课堂上有一个作业要做。提示是编写一个类,从json文件读取数据,然后将数据写入CSV格式的. txt文件。
然后,我们需要创建一个名为save_as_csv的方法,该方法将DBN(地区局编号)列表作为参数,并保存一个CSV文件(下面是它需要的外观示例),但仅包含与列表中的DBN相对应的行(以及列标题行)。您可以假设传递给方法的列表中的所有DBN都存在于JSON文件中。CSV文件中的行必须按DBN升序排序。输出文件的名称必须为output.csv。
我都做过了。但是我的输出. csv文件格式不正确。
以下是我到目前为止的代码:

import json
"""import json module"""

class SatData:
    """reads a json files and writes it to a CSV file"""

def __init__(self):
    try:
        with open('sat.json', 'r') as json_file:
            self._data_list = json.load(json_file)
    except FileNotFoundError:
        print('file not found')

def save_as_csv(self, dbn_list):
    csv_list = []
    rows = ['DBN', 'School Name', 'Number of Test Takers',
            'Critical Reading Mean', 'Mathematics Mean', 'Writing Mean']
    for item in self._data_list['data']:
        if item[8] in dbn_list:
            csv_list.append(str(item[8:14]))
    sorted(csv_list)
    with open('output.csv', 'w') as new_file:
        new_file.write(','.join(rows))
        new_file.write('\n')
        pos = 0
        while pos < len(csv_list):
            new_file.write(csv_list[pos])
            new_file.write('\n')
            pos += 1
        return csv_list

sd = SatData()
dbns = ["02M303", "02M294", "01M450", "02M418"]
sd.save_as_csv(dbns)

字符串
我的期望输出是:

DBN,School Name,Number of Test Takers,Critical Reading Mean,Mathematics Mean,Writing Mean
01M450,East Side Community High School,69,418,431,402
02M294,HIGH SCHOOL FOR HIST AND COMM,51,382,364,366
02M303,The Facing History School,59,381,373,377
02M418,Millennium High School,140,512,554,523


我得到的输出:

DBN,School Name,Number of Test Takers,Critical Reading Mean,Mathematics Mean,Writing Mean
['01M450', 'East Side Community High School ', '69', '418', '431', '402']
['02M294', 'HIGH SCHOOL FOR HIST AND COMM ', '51', '382', '364', '366']
['02M303', 'The Facing History School ', '59', '381', '373', '377']
['02M418', 'Millennium High School ', '140', '512', '554', '523']


长话短说,我知道csv_list中的元素只是一个嵌套的列表,但是我如何让它在没有括号和数据周围的单引号的情况下显示呢?
我尝试了以下几点:

*csv_list, sep = ','


它只会给我输出每个单独的字符由逗号分隔

','.join(csv_list)


问题是如果我尝试拆分csv_list,那么它将生成未知数量的新列表,这取决于有多少个匹配的DBN,所以这不会起作用。我不知道还能做什么。
谢谢!

umuewwlo

umuewwlo1#

我相信你的问题福尔斯在这条线上:csv_list.append(str(item[8:14]))当你把一个列表(item[8:14])转换成一个字符串时,你会得到带引号的方括号。一个更好的方法是csv_list.append(','.join(item[8:14])),或者你可以使用列表理解来删除空格:csv_list.append(','.join(a.strip() for a in item[8:14]))

wz3gfoph

wz3gfoph2#

csv_list是一个列表的列表。在这种情况下,使用joinlist comprehension 将起作用。在你的例子中,学校名称中似乎有一些空格,你可以为你加入的列表中的每个元素使用strip。你也可以print到outfile来为你处理换行符。

rows = ['DBN', 'School Name', 'Number of Test Takers',
        'Critical Reading Mean', 'Mathematics Mean', 'Writing Mean']

csv_list = [
    ['01M450', 'East Side Community High School ', '69', '418', '431', '402'],
    ['02M294', 'HIGH SCHOOL FOR HIST AND COMM ', '51', '382', '364', '366'],
    ['02M303', 'The Facing History School ', '59', '381', '373', '377'],
    ['02M418', 'Millennium High School ', '140', '512', '554', '523'],
]

csv_list = [','.join(j.strip() for j in i) for i in csv_list]

with open('output.csv', 'w') as new_file:
    print(','.join(rows), file=new_file)
    for row in csv_list: print(row, file=new_file)

字符串
https://onlinegdb.com/yThIfUFWy

ubbxdtey

ubbxdtey3#

所以我实际上发现的是,这是上述其他建议对我有效的组合。
我改变了向csv_list添加内容的方式:

for item in self._data_list['data']:
        if item[8] in dbn_list:
            csv_list.append(item[8:14])

字符串
这是向列表追加列表,而不是向列表追加字符串。
然后,我去掉了while循环,使用了for循环:

for list_item in csv_list:
            if ',' in list_item[1]:
                list_item[1] = f'"{list_item[1]}"'
            new_file.write(','.join(list_item))
            new_file.write('\n')


其中包括一个额外的检查,我没有最初寻求帮助。现在我的输出正是我想要的。

相关问题