如何在 python 中将多个字典对象合并到一个列表中?

How do I combine multiple dictionary objects into one list in python?

我已经尝试了几个小时来完成这项工作。我正在尝试从文件中读取并将所有数据组织到字典中,然后将所有字典组合到一个列表中。然而,我已经尽可能将所有数据放入字典,但每当我尝试将它们附加到 =list 每次迭代时,它要么完全中断,要么只添加文件的最后一行??`def

readParkFile(fileName="national_parks.csv"):
    f = open(fileName, "r")
    parkList = []
    parkDict = {}
    header = f.readline().split(",")
    keys = list(header)

    for line in f:
        tmp = list(line.split(","))
        quote = tmp[7:]
        fullQuote = ','.join(quote)
        del tmp[7:]
        tmp.append(fullQuote)
        for value in tmp:
            parkDict[keys[tmp.index(value)]] = value
        parkList.append(parkDict)
        print(parkDict)

readParkFile()`

Code,Name,State,Acres,Latitude,Longitude,Date,Description ACAD,Acadia National Park,ME,47390,44.35,-68.21,1919-02-26,"Covering most of Mount Desert Island and other coastal islands, Acadia features the tallest mountain on the Atlantic coast of the United States, granite peaks, ocean shoreline, woodlands, and lakes. There are freshwater, estuary, forest, and intertidal habitats." ARCH,Arches National Park,UT,76519,38.68,-109.57,1971-11-12,"This site features more than 2,000 natural sandstone arches, with some of the most popular arches in the park being Delicate Arch, Landscape Arch and Double Arch. Millions of years of erosion have created these structures in a desert climate where the arid ground has life-sustaining biological soil crusts and potholes that serve as natural water-collecting basins. Other geologic formations include stone pinnacles, fins, and balancing rocks." BADL,Badlands National Park,SD,242756,43.75,-102.5,1978-11-10,"The Badlands are a collection of buttes, pinnacles, spires, and mixed-grass prairies. The White River Badlands contain the largest assemblage of known late Eocene and Oligocene mammal fossils. The wildlife includes bison, bighorn sheep, black-footed ferrets, and prairie dogs." BIBE,Big Bend National Park,TX,801163,29.25,-103.25,1944-06-12,"Named for the prominent bend in the Rio Grande along the U.S.-Mexico border, this park encompasses a large and remote part of the Chihuahuan Desert. Its main attraction is backcountry recreation in the arid Chisos Mountains and in canyons along the river. A wide variety of Cretaceous and Tertiary fossils as well as cultural artifacts of Native Americans also exist within its borders." BISC,Biscayne National Park,FL,172924,25.65,-80.08,1980-06-28,"The central part of Biscayne Bay, this mostly underwater park at the north end of the Florida Keys has four interrelated marine ecosystems: mangrove forest, the Bay, the Keys, and coral reefs. Threatened animals include the West Indian manatee, American crocodile, various sea turtles, and peregrine falcon." BLCA,Black Canyon of the Gunnison National Park,CO,32950,38.57,-107.72,1999-10-21,"The park protects a quarter of the Gunnison River, which slices sheer canyon walls from dark Precambrian-era rock. The canyon features some of the steepest cliffs and oldest rock in North America, and is a popular site for river rafting and rock climbing. The deep, narrow canyon is composed of gneiss and schist, which appears black when in shadow." BRCA,Bryce Canyon National Park,UT,35835,37.57,-112.18,1928-02-25,"Bryce Canyon is a geological amphitheater on the Paunsaugunt Plateau with hundreds of tall, multicolored sandstone hoodoos formed by erosion. The region was originally settled by Native Americans and later by Mormon pioneers." CANY,Canyonlands National Park,UT,337598,38.2,-109.93,1964-09-12,"This landscape was eroded into a maze of canyons, buttes, and mesas by the combined efforts of the Colorado River, Green River, and their tributaries, which divide the park into three districts. The park also contains rock pinnacles and arches, as well as artifacts from Ancient Pueblo peoples." CARE,Capitol Reef National Park,UT,241904,38.2,-111.17,1971-12-18,"The park's Waterpocket Fold is a 100-mile (160 km) monocline that exhibits the earth's diverse geologic layers. Other natural features include monoliths, cliffs, and sandstone domes shaped like the United States Capitol." CAVE,Carlsbad Caverns National Park,NM,46766,32.17,-104.44,1930-05-14,"Carlsbad Caverns has 117 caves, the longest of which is over 120 miles (190 km) long. The Big Room is almost 4,000 feet (1,200 m) long, and the caves are home to over 400,000 Mexican free-tailed bats and sixteen other species. Above ground are the Chihuahuan Desert and Rattlesnake Springs." CHIS,Channel Islands National Park,CA,249561,34.01,-119.42,1980-03-05,"Five of the eight Channel Islands are protected, with half of the park's area underwater. The islands have a unique Mediterranean ecosystem originally settled by the Chumash people. They are home to over 2,000 species of land plants and animals, 145 endemic to them, including the island fox. Ferry services offer transportation to the islands from the mainland." CONG,Congaree National Park,SC,26546,33.78,-80.78,2003-11-10,"On the Congaree River, this park is the largest portion of old-growth floodplain forest left in North America. Some of the trees are the tallest in the eastern United States. An elevated walkway called the Boardwalk Loop guides visitors through the swamp." CRLA,Crater Lake National Park,OR,183224,42.94,-122.1,1902-05-22,"Crater Lake lies in the caldera of an ancient volcano called Mount Mazama that collapsed 7,700 years ago. The lake is the deepest in the United States and is noted for its vivid blue color and water clarity. Wizard Island and the Phantom Ship are more recent volcanic formations within the caldera. As the lake has no inlets or outlets, it is replenished only by precipitation." CUVA,Cuyahoga Valley National Park,OH,32950,41.24,-81.55,2000-10-11,"This park along the Cuyahoga River has waterfalls, hills, trails, and exhibits on early rural living. The Ohio and Erie Canal Towpath Trail follows the Ohio and Erie Canal, where mules towed canal boats. The park has numerous historic homes, bridges, and structures, and also offers a scenic train ride."

预期输出:

[{“code”:, “name”: …},{“code”:, “name”: …}, {“code”:, “name”: …}]

您提供的信息并不是很有帮助。提供输入时,尽量使其容易 copy-paste。我们无法将其复制并粘贴到 .csv 文件中。

无论如何,我为此制作了一个小的 .csv,我认为这段代码提供了您想要的:

finalList = []
with open('smth.csv','r') as file:          
    keys = file.readline().split(',') 
    line = file.readline().split(',')
    while line: # Exits when readline returns an empty line 
        finalList.append({keys[0]: line[0],
                            keys[1]: line[1],
                            keys[2]: line[2]  
                            })
        line = file.readline()

您也可以使用 file.readlines() 来缩短它,同时使用 returns。

我复制了您的输入,在 CSV 中的每一行之前添加了换行符(参见 here),并且 将字典的初始化移到了循环中 。 运行 此代码:

from pprint import pprint

def readParkFile(fileName="temp.csv"):
    f = open(fileName, "r")
    parkList = []
    header = f.readline().split(",")
    keys = list(header)

    for line in f:
        parkDict = {}  # This is the issue! Moving the initialization of this dictionary into the loop.
        tmp = list(line.split(","))
        quote = tmp[7:]
        fullQuote = ','.join(quote)
        del tmp[7:]
        tmp.append(fullQuote)
        for value in tmp:
            parkDict[keys[tmp.index(value)]] = value
        # pprint(parkDict)
        parkList.append(parkDict)
    # pprint(parkList)

if __name__ == '__main__':
    readParkFile()

你会得到这个输出:

[{'Acres': '47390',
  'Code': 'ACAD',
  'Date': '1919-02-26',
  'Description \n': '"Covering most of Mount Desert Island and other coastal '
                    'islands, Acadia features the tallest mountain on the '
                    'Atlantic coast of the United States, granite peaks, ocean '
                    'shoreline, woodlands, and lakes. There are freshwater, '
                    'estuary, forest, and intertidal habitats." \n',
  'Latitude': '44.35',
  'Longitude': '-68.21',
  'Name': 'Acadia National Park',
  'State': 'ME'},
 {'Acres': '76519',
  'Code': 'ARCH',
  'Date': '1971-11-12',
  'Description \n': '"This site features more than 2\,000 natural sandstone '
                    'arches, with some of the most popular arches in the park '
                    'being Delicate Arch, Landscape Arch and Double Arch. '
                    'Millions of years of erosion have created these '
                    'structures in a desert climate where the arid ground has '
                    'life-sustaining biological soil crusts and potholes that '
                    'serve as natural water-collecting basins. Other geologic '
                    'formations include stone pinnacles, fins, and balancing '
                    'rocks." \n',
  'Latitude': '38.68',
  'Longitude': '-109.57',
  'Name': 'Arches National Park',
  'State': 'UT'},
 {'Acres': '242756',
  'Code': 'BADL',
  'Date': '1978-11-10',
  'Description \n': '"The Badlands are a collection of buttes, pinnacles, '
                    'spires, and mixed-grass prairies. The White River '
                    'Badlands contain the largest assemblage of known late '
                    'Eocene and Oligocene mammal fossils. The wildlife '
                    'includes bison, bighorn sheep, black-footed ferrets, and '
                    'prairie dogs."\n',
  'Latitude': '43.75',
  'Longitude': '-102.5',
  'Name': 'Badlands National Park',
  'State': 'SD'},
 {'Acres': '801163',
  'Code': 'BIBE',
  'Date': '1944-06-12',
  'Description \n': '"Named for the prominent bend in the Rio Grande along the '
                    'U.S.-Mexico border, this park encompasses a large and '
                    'remote part of the Chihuahuan Desert. Its main attraction '
                    'is backcountry recreation in the arid Chisos Mountains '
                    'and in canyons along the river. A wide variety of '
                    'Cretaceous and Tertiary fossils as well as cultural '
                    'artifacts of Native Americans also exist within its '
                    'borders." \n',
  'Latitude': '29.25',
  'Longitude': '-103.25',
  'Name': 'Big Bend National Park',
  'State': 'TX'},
 {'Acres': '172924',
  'Code': 'BISC',
  'Date': '1980-06-28',
  'Description \n': '"The central part of Biscayne Bay, this mostly underwater '
                    'park at the north end of the Florida Keys has four '
                    'interrelated marine ecosystems: mangrove forest, the Bay, '
                    'the Keys, and coral reefs. Threatened animals include the '
                    'West Indian manatee, American crocodile, various sea '
                    'turtles, and peregrine falcon." \n',
  'Latitude': '25.65',
  'Longitude': '-80.08',
  'Name': 'Biscayne National Park',
  'State': 'FL'},
 {'Acres': '32950',
  'Code': 'BLCA',
  'Date': '1999-10-21',
  'Description \n': '"The park protects a quarter of the Gunnison River, which '
                    'slices sheer canyon walls from dark Precambrian-era rock. '
                    'The canyon features some of the steepest cliffs and '
                    'oldest rock in North America, and is a popular site for '
                    'river rafting and rock climbing. The deep, narrow canyon '
                    'is composed of gneiss and schist, which appears black '
                    'when in shadow." \n',
  'Latitude': '38.57',
  'Longitude': '-107.72',
  'Name': 'Black Canyon of the Gunnison National Park',
  'State': 'CO'},
 {'Acres': '35835',
  'Code': 'BRCA',
  'Date': '1928-02-25',
  'Description \n': '"Bryce Canyon is a geological amphitheater on the '
                    'Paunsaugunt Plateau with hundreds of tall, multicolored '
                    'sandstone hoodoos formed by erosion. The region was '
                    'originally settled by Native Americans and later by '
                    'Mormon pioneers." \n',
  'Latitude': '37.57',
  'Longitude': '-112.18',
  'Name': 'Bryce Canyon National Park',
  'State': 'UT'},
 {'Acres': '337598',
  'Code': 'CANY',
  'Date': '1964-09-12',
  'Description \n': '"This landscape was eroded into a maze of canyons, '
                    'buttes, and mesas by the combined efforts of the Colorado '
                    'River, Green River, and their tributaries, which divide '
                    'the park into three districts. The park also contains '
                    'rock pinnacles and arches, as well as artifacts from '
                    'Ancient Pueblo peoples." \n',
  'Latitude': '38.2',
  'Longitude': '-109.93',
  'Name': 'Canyonlands National Park',
  'State': 'UT'},
 {'Acres': '241904',
  'Code': 'CARE',
  'Date': '1971-12-18',
  'Description \n': '"The park\'s Waterpocket Fold is a 100-mile (160 km) '
                    "monocline that exhibits the earth's diverse geologic "
                    'layers. Other natural features include monoliths, cliffs, '
                    'and sandstone domes shaped like the United States '
                    'Capitol." \n',
  'Latitude': '38.2',
  'Longitude': '-111.17',
  'Name': 'Capitol Reef National Park',
  'State': 'UT'},
 {'Acres': '46766',
  'Code': 'CAVE',
  'Date': '1930-05-14',
  'Description \n': '"Carlsbad Caverns has 117 caves, the longest of which is '
                    'over 120 miles (190 km) long. The Big Room is almost '
                    '4,000 feet (1,200 m) long, and the caves are home to over '
                    '400,000 Mexican free-tailed bats and sixteen other '
                    'species. Above ground are the Chihuahuan Desert and '
                    'Rattlesnake Springs." \n',
  'Latitude': '32.17',
  'Longitude': '-104.44',
  'Name': 'Carlsbad Caverns National Park',
  'State': 'NM'},
 {'Acres': '249561',
  'Code': 'CHIS',
  'Date': '1980-03-05',
  'Description \n': '"Five of the eight Channel Islands are protected, with '
                    "half of the park's area underwater. The islands have a "
                    'unique Mediterranean ecosystem originally settled by the '
                    'Chumash people. They are home to over 2,000 species of '
                    'land plants and animals, 145 endemic to them, including '
                    'the island fox. Ferry services offer transportation to '
                    'the islands from the mainland." \n',
  'Latitude': '34.01',
  'Longitude': '-119.42',
  'Name': 'Channel Islands National Park',
  'State': 'CA'},
 {'Acres': '26546',
  'Code': 'CONG',
  'Date': '2003-11-10',
  'Description \n': '"On the Congaree River, this park is the largest portion '
                    'of old-growth floodplain forest left in North America. '
                    'Some of the trees are the tallest in the eastern United '
                    'States. An elevated walkway called the Boardwalk Loop '
                    'guides visitors through the swamp." \n',
  'Latitude': '33.78',
  'Longitude': '-80.78',
  'Name': 'Congaree National Park',
  'State': 'SC'},
 {'Acres': '183224',
  'Code': 'CRLA',
  'Date': '1902-05-22',
  'Description \n': '"Crater Lake lies in the caldera of an ancient volcano '
                    'called Mount Mazama that collapsed 7,700 years ago. The '
                    'lake is the deepest in the United States and is noted for '
                    'its vivid blue color and water clarity. Wizard Island and '
                    'the Phantom Ship are more recent volcanic formations '
                    'within the caldera. As the lake has no inlets or outlets, '
                    'it is replenished only by precipitation." \n',
  'Latitude': '42.94',
  'Longitude': '-122.1',
  'Name': 'Crater Lake National Park',
  'State': 'OR'},
 {'Acres': '32950',
  'Code': 'CUVA',
  'Date': '2000-10-11',
  'Description \n': '"This park along the Cuyahoga River has waterfalls, '
                    'hills, trails, and exhibits on early rural living. The '
                    'Ohio and Erie Canal Towpath Trail follows the Ohio and '
                    'Erie Canal, where mules towed canal boats. The park has '
                    'numerous historic homes, bridges, and structures, and '
                    'also offers a scenic train ride."\n',
  'Latitude': '41.24',
  'Longitude': '-81.55',
  'Name': 'Cuyahoga Valley National Park',
  'State': 'OH'}]

(注意:您可能想为此使用 pandas。请参阅此答案的后半部分作为示例。)

直接回答你的问题: 如果您想要实际键入的值(英亩为 int,latitude/longitude 为 float),这里有一种使用正则表达式的方法:

import re
def readParkFile(fileName="national_parks.csv"):
    parkList = []
    f = open(fileName, "r")
    keys = f.readline().strip("\n").split(",")
    for line in f:
        v = re.search('(.*?),(.*?),(.*?),(.*?),(.*?),(.*?),(.*?),(.*)', line).groups()
        Code, Name, State, Acres, Latitude, Longitude, Date, Description = v[0], v[1], v[2], int(v[3]), float(v[4]), float(v[5]), v[6], v[7][1:-1]
        parkDict = dict(zip(keys, [Code, Name, State, Acres, Latitude, Longitude, Date, Description]))
        parkList.append(parkDict)
    return parkList

parkList = readParkFile()

在循环内,re.search() 在除最后一个 (Description) 之外的所有 comma-separated 组中使用 non-greedy 限定符,然后将数字字段转换为数字并去除来自 Description 的周围引号。这些键入的值然后使用 zip()keys 组合并转换为 dict,后者又附加到结果 parkList。遍历 csv 文件中的所有行后,函数 returns parkList.

生成的字典列表的第一个字典元素如下所示:

{'Code': 'ACAD', 'Name': 'Acadia National Park', 'State': 'ME', 'Acres': 47390, 'Latitude': 44.35, 'Longitude': -68.21, 'Date': '1919-02-26', 'Description': 'Covering most of Mount Desert Island and other coastal islands, Acadia features the tallest mountain on the Atlantic coast of the United States, granite peaks, ocean shoreline, woodlands, and lakes. There are freshwater, estuary, forest, and intertidal habitats.'}

使用pandas的替代方法: 在 pandas 中,您可以这样做:

import pandas as pd
df = pd.read_csv("national_parks.csv")
print(df)
print(df.dtypes)
parkList = df.to_dict('records')
print(parkList[0])

它将给出以下输出:

    Code                                        Name State   Acres  Latitude  Longitude        Date                                        Description
0   ACAD                        Acadia National Park    ME   47390     44.35     -68.21  1919-02-26  Covering most of Mount Desert Island and other...
1   ARCH                        Arches National Park    UT   76519     38.68    -109.57  1971-11-12  This site features more than 2,000 natural san...
2   BADL                      Badlands National Park    SD  242756     43.75    -102.50  1978-11-10  The Badlands are a collection of buttes, pinna...
3   BIBE                      Big Bend National Park    TX  801163     29.25    -103.25  1944-06-12  Named for the prominent bend in the Rio Grande...
4   BISC                      Biscayne National Park    FL  172924     25.65     -80.08  1980-06-28  The central part of Biscayne Bay, this mostly ...
5   BLCA  Black Canyon of the Gunnison National Park    CO   32950     38.57    -107.72  1999-10-21  The park protects a quarter of the Gunnison Ri...
6   BRCA                  Bryce Canyon National Park    UT   35835     37.57    -112.18  1928-02-25  Bryce Canyon is a geological amphitheater on t...
7   CANY                   Canyonlands National Park    UT  337598     38.20    -109.93  1964-09-12  This landscape was eroded into a maze of canyo...
8   CARE                  Capitol Reef National Park    UT  241904     38.20    -111.17  1971-12-18  The park's Waterpocket Fold is a 100-mile (160...
9   CAVE              Carlsbad Caverns National Park    NM   46766     32.17    -104.44  1930-05-14  Carlsbad Caverns has 117 caves, the longest of...
10  CHIS               Channel Islands National Park    CA  249561     34.01    -119.42  1980-03-05  Five of the eight Channel Islands are protecte...
11  CONG                      Congaree National Park    SC   26546     33.78     -80.78  2003-11-10  On the Congaree River, this park is the larges...
12  CRLA                   Crater Lake National Park    OR  183224     42.94    -122.10  1902-05-22  Crater Lake lies in the caldera of an ancient ...
13  CUVA               Cuyahoga Valley National Park    OH   32950     41.24     -81.55  2000-10-11  This park along the Cuyahoga River has waterfa...
Code            object
Name            object
State           object
Acres            int64
Latitude       float64
Longitude      float64
Date            object
Description     object
dtype: object
{'Code': 'ACAD', 'Name': 'Acadia National Park', 'State': 'ME', 'Acres': 47390, 'Latitude': 44.35, 'Longitude': -68.21, 'Date': '1919-02-26', 'Description': 'Covering most of Mount Desert Island and other coastal islands, Acadia features the tallest mountain on the Atlantic coast of the United States, granite peaks, ocean shoreline, woodlands, and lakes. There are freshwater, estuary, forest, and intertidal habitats.'}

如您所见,通过一次调用 read_csv(),pandas 解析 csv 文件,计算出每一列的数据类型,并将其全部组装到一个 DataFrame 对象中。然后,您可以通过使用参数 'records'.

调用 DataFrame 对象的 to_dict() 方法来获取您正在尝试的字典列表