- 我们不允许将任何模块导入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,所以这不会起作用。我不知道还能做什么。
谢谢!
3条答案
按热度按时间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]))
wz3gfoph2#
csv_list
是一个列表的列表。在这种情况下,使用join
的 list comprehension 将起作用。在你的例子中,学校名称中似乎有一些空格,你可以为你加入的列表中的每个元素使用strip
。你也可以print
到outfile来为你处理换行符。字符串
https://onlinegdb.com/yThIfUFWy
ubbxdtey3#
所以我实际上发现的是,这是上述其他建议对我有效的组合。
我改变了向csv_list添加内容的方式:
字符串
这是向列表追加列表,而不是向列表追加字符串。
然后,我去掉了while循环,使用了for循环:
型
其中包括一个额外的检查,我没有最初寻求帮助。现在我的输出正是我想要的。