99 lines
3.2 KiB
Markdown
99 lines
3.2 KiB
Markdown
---
|
||
id: practical-python-2.23
|
||
source_exercise_id: "2.23"
|
||
title: "Extracting Data From CSV Files"
|
||
section: "2.6 List Comprehensions"
|
||
source_path: "02_Working_with_data/06_List_comprehension.md"
|
||
source_repo: "https://github.com/dabeaz-course/practical-python"
|
||
source_commit: "93dca856b41c61a0a0f85ae334116e4c125629ea"
|
||
student_visible_solution: false
|
||
has_private_solution: false
|
||
skip: false
|
||
---
|
||
|
||
# Exercise 2.23: Extracting Data From CSV Files
|
||
|
||
> Source: Practical Python Programming, `02_Working_with_data/06_List_comprehension.md`.
|
||
|
||
### Exercise 2.23: Extracting Data From CSV Files
|
||
|
||
Knowing how to use various combinations of list, set, and dictionary
|
||
comprehensions can be useful in various forms of data processing.
|
||
Here’s an example that shows how to extract selected columns from a
|
||
CSV file.
|
||
|
||
First, read a row of header information from a CSV file:
|
||
|
||
```python
|
||
>>> import csv
|
||
>>> f = open('Data/portfoliodate.csv')
|
||
>>> rows = csv.reader(f)
|
||
>>> headers = next(rows)
|
||
>>> headers
|
||
['name', 'date', 'time', 'shares', 'price']
|
||
>>>
|
||
```
|
||
|
||
Next, define a variable that lists the columns that you actually care about:
|
||
|
||
```python
|
||
>>> select = ['name', 'shares', 'price']
|
||
>>>
|
||
```
|
||
|
||
Now, locate the indices of the above columns in the source CSV file:
|
||
|
||
```python
|
||
>>> indices = [ headers.index(colname) for colname in select ]
|
||
>>> indices
|
||
[0, 3, 4]
|
||
>>>
|
||
```
|
||
|
||
Finally, read a row of data and turn it into a dictionary using a
|
||
dictionary comprehension:
|
||
|
||
```python
|
||
>>> row = next(rows)
|
||
>>> record = { colname: row[index] for colname, index in zip(select, indices) } # dict-comprehension
|
||
>>> record
|
||
{'price': '32.20', 'name': 'AA', 'shares': '100'}
|
||
>>>
|
||
```
|
||
|
||
If you’re feeling comfortable with what just happened, read the rest
|
||
of the file:
|
||
|
||
```python
|
||
>>> portfolio = [ { colname: row[index] for colname, index in zip(select, indices) } for row in rows ]
|
||
>>> portfolio
|
||
[{'price': '91.10', 'name': 'IBM', 'shares': '50'}, {'price': '83.44', 'name': 'CAT', 'shares': '150'},
|
||
{'price': '51.23', 'name': 'MSFT', 'shares': '200'}, {'price': '40.37', 'name': 'GE', 'shares': '95'},
|
||
{'price': '65.10', 'name': 'MSFT', 'shares': '50'}, {'price': '70.44', 'name': 'IBM', 'shares': '100'}]
|
||
>>>
|
||
```
|
||
|
||
Oh my, you just reduced much of the `read_portfolio()` function to a single statement.
|
||
|
||
### Commentary
|
||
|
||
List comprehensions are commonly used in Python as an efficient means
|
||
for transforming, filtering, or collecting data. Due to the syntax,
|
||
you don’t want to go overboard—try to keep each list comprehension as
|
||
simple as possible. It’s okay to break things into multiple
|
||
steps. For example, it’s not clear that you would want to spring that
|
||
last example on your unsuspecting co-workers.
|
||
|
||
That said, knowing how to quickly manipulate data is a skill that’s
|
||
incredibly useful. There are numerous situations where you might have
|
||
to solve some kind of one-off problem involving data imports, exports,
|
||
extraction, and so forth. Becoming a guru master of list
|
||
comprehensions can substantially reduce the time spent devising a
|
||
solution. Also, don't forget about the `collections` module.
|
||
|
||
[Contents](../Contents.md) \| [Previous (2.5 Collections)](05_Collections.md) \| [Next (2.7 Object Model)](07_Objects.md)
|
||
|
||
## 关联来源
|
||
|
||
- [[summaries/06_List_comprehension]]
|