Как мне читать и писать файлы CSV с помощью Python?

У меня есть файл example.csv с содержанием

1,"A towel,",1.0
42," it says, ",2.0
1337,is about the most ,-1
0,massively useful thing ,123
-2,an interstellar hitchhiker can have.,3

Как мне это прочитать example.csv с питоном?

Точно так же, если у меня есть

data = [(1, "A towel,", 1.0),
        (42, " it says, ", 2.0),
        (1337, "is about the most ", -1),
        (0, "massively useful thing ", 123),
        (-2, "an interstellar hitchhiker can have.", 3)]

Как мне написать data в CSV-файл с Python?

7 ответов

Решение

Вот несколько минимальных полных примеров, как читать файлы CSV и как писать файлы CSV с помощью Python.

Python 2 + 3: чтение файла CSV

Чистый Питон

# -*- coding: utf-8 -*-

import csv
import sys

# Define data
data = [(1, "A towel,", 1.0),
        (42, " it says, ", 2.0),
        (1337, "is about the most ", -1),
        (0, "massively useful thing ", 123),
        (-2, "an interstellar hitchhiker can have.", 3)]

# Write CSV file
kwargs = {'newline': ''}
mode = 'w'
if sys.version_info < (3, 0):
    kwargs.pop('newline', None)
    mode = 'wb'

with open('test.csv', mode, **kwargs) as fp:
    writer = csv.writer(fp, delimiter=',')
    # writer.writerow(["your", "header", "foo"])  # write header
    writer.writerows(data)

# Read CSV file
kwargs = {'newline': ''}
mode = 'r'
if sys.version_info < (3, 0):
    kwargs.pop('newline', None)
    mode = 'rb'
with open('test.csv', mode, **kwargs) as fp:
    reader = csv.reader(fp, delimiter=',', quotechar='"')
    # next(reader, None)  # skip the headers
    data_read = [row for row in reader]

print(data_read)

После этого содержимое data_read являются

[['1', 'A towel,', '1.0'],
 ['42', ' it says, ', '2.0'],
 ['1337', 'is about the most ', '-1'],
 ['0', 'massively useful thing ', '123'],
 ['-2', 'an interstellar hitchhiker can have.', '3']]

Юникод и Python 2.X

Если вы хотите написать Unicode, вы должны установить unicodecsv, Не открывайте файл с codecs.open но просто с open, Напишите это с

import unicodecsv as csv
# Write CSV file
with open('test.csv', 'w', newline='') as fp:
    writer = csv.writer(fp, encoding='utf-8')
    # writer.writerow(["your", "header", "foo"])  # write header
    writer.writerows(data)

связанные с

MPU

Посмотрите на мой пакет утилит mpu для супер просто и легко запомнить:

import mpu.io
data = mpu.io.read('example.csv', delimiter=',', quotechar='"', skiprows=None)
mpu.io.write('example.csv', data)

Панды

import pandas as pd

# Read the CSV into a pandas data frame (df)
#   With a df you can do many things
#   most important: visualize data with Seaborn
df = pd.read_csv('myfile.csv', sep=',')
print(df)

# Or export it in many ways, e.g. a list of tuples
tuples = [tuple(x) for x in df.values]

# or export it as a list of dicts
dicts = df.to_dict().values()

Увидеть read_csv документы для получения дополнительной информации. Обратите внимание, что pandas автоматически определяет наличие строки заголовка, но вы также можете установить ее вручную.

Если вы не слышали о Seaborn, я рекомендую взглянуть на это.

Другой

Чтение CSV-файлов поддерживается рядом других библиотек, например:

  • dask.dataframe.read_csv
  • spark.read.csv

Создан файл CSV

1,"A towel,",1.0
42," it says, ",2.0
1337,is about the most ,-1
0,massively useful thing ,123
-2,an interstellar hitchhiker can have.,3

Общие окончания файлов

.csv

Работа с данными

После считывания файла CSV в список кортежей / диктов или данных Pandas он просто работает с данными такого рода. Ничего особенного в CSV.

альтернативы

Для вашего приложения может быть важно следующее:

  • Поддержка другими языками программирования
  • Чтение / запись производительности
  • Компактность (размер файла)

Смотрите также: Сравнение форматов сериализации данных

Если вы предпочитаете создавать конфигурационные файлы, вы можете прочитать мою короткую статью Конфигурационные файлы в Python

При необходимости прочтите файл csv без использования модуля csv:

      rows = []
with open('test.csv') as f:
    for line in f:
        # strip whitespace
        line = line.strip()
        # separate the columns
        line = line.split(',')
        # save the line for use later
        rows.append(line)

Если вы работаете с данными в формате CSV и вам нужно решение с меньшим объемом памяти, чем pandas, вы можете попробовать мой пакет, littletable. Может быть установлен с помощью pip или просто добавлен как один файл .py с вашим собственным кодом, что делает его очень переносимым и подходящим для бессерверных приложений.

Чтение данных CSV так же просто, как вызов csv_import:

      data = """\
1,"A towel,",1.0
42," it says, ",2.0
1337,is about the most ,-1
0,massively useful thing ,123
-2,an interstellar hitchhiker can have.,3"""

import littletable as lt
tbl = lt.Table().csv_import(data, fieldnames="number1,words,number2".split(','))
tbl.present()

Отпечатки:

        Number1   Words                                  Number2  
 ────────────────────────────────────────────────────────── 
  1         A towel,                               1.0      
  42         it says,                              2.0      
  1337      is about the most                      -1       
  0         massively useful thing                 123      
  -2        an interstellar hitchhiker can have.   3    

(использует расширенный модуль для представления таблиц.)

не пытается автоматически преобразовать числовые данные, поэтому для числовых столбцов необходима функция числового преобразования.

      def get_numeric(s):
    try:
        return int(s)
    except ValueError:
        try:
            return float(s)
        except ValueError:
            return s

tbl = lt.Table().csv_import(
    data,
    fieldnames="number1,words,number2".split(','),
    transforms={}.fromkeys("number1 number2".split(), get_numeric)
)
tbl.present()

Это дает:

        Number1   Words                                  Number2  
 ────────────────────────────────────────────────────────── 
        1   A towel,                                   1.0  
       42    it says,                                  2.0  
     1337   is about the most                           -1  
        0   massively useful thing                     123  
       -2   an interstellar hitchhiker can have.         3  

Числовые столбцы выравниваются по правому краю, а не по левому.

littletableтакже имеет другие функции ORM, такие как индексирование, объединение, поворот и полнотекстовый поиск. Вот таблица статистики по числовым столбцам:

      tbl.stats("number1 number2".split()).present()

  Name       Mean   Min    Max   Variance              Std_Dev   Count   Missing  
 ──────────────────────────────────────────────────────────────────────────────── 
  number1   275.6    -2   1337   352390.3    593.6247130974249       5         0  
  number2    25.6    -1    123     2966.8   54.468339427597755       5         0  

или транспонированные:

      tbl.stats("number1 number2".split(), by_field=False).present()

  Stat                 Number1              Number2 
 ─────────────────────────────────────────────────── 
  mean                   275.6                 25.6
  min                       -2                   -1
  max                     1337                  123
  variance            352390.3               2966.8
  std_dev    593.6247130974249   54.468339427597755
  count                      5                    5
  missing                    0                    0

Также могут быть выведены другие форматы, такие как Markdown:

      print(tbl.stats("number1 number2".split(), by_field=False).as_markdown())

| stat | number1 | number2 |
|---|---:|---:|
| mean | 275.6 | 25.6 |
| min | -2 | -1 |
| max | 1337 | 123 |
| variance | 352390.3 | 2966.8 |
| std_dev | 593.6247130974249 | 54.468339427597755 |
| count | 5 | 5 |
| missing | 0 | 0 |

Что будет отображаться из Markdown как

Наконец, вот текстовый поиск по словам для любой записи со словом «автостопщик»:

      tbl.create_search_index("words")
for match, score in tbl.search.words("hitchhiker"):
    print(match)

Отпечатки:

namespace(number1=-2, words='межзвездный автостопщик может иметь.', number2=3)

Написание файла CSV

Сначала вам нужно импортировать CSV

Например:

import csv

with open('eggs.csv', 'wb') as csvfile:
    spamwriter = csv.writer(csvfile, delimiter=' ',
                        quotechar='|', quoting=csv.QUOTE_MINIMAL)
    spamwriter.writerow(['Spam'] * 5 + ['Baked Beans'])
    spamwriter.writerow(['Spam', 'Lovely Spam', 'Wonderful Spam'])

Чтобы прочитать файл csv с помощью Pandas

use pd.read_csv("D:\\sample.csv")

using only python :

fopen=open("D:\\sample.csv","r") 

print(fopen.read())

Для создания и записи в файл csv

В приведенном ниже примере демонстрируется создание и запись файла CSV. чтобы создать динамический модуль записи файлов, нам нужно импортировать пакет import csv, а затем создать экземпляр файла со ссылкой на файл Ex:

with open("D:\sample.csv","w",newline="") as file_writer

Здесь, если файл не существует с указанным каталогом файлов, тогда python создаст тот же файл в указанном каталоге и w представляет запись, если вы хотите прочитать файл, замените w с r или добавить в существующий файл, затем a.

newline="" указывает, что он удаляет лишнюю пустую строку каждый раз, когда вы создаете строку, поэтому для удаления пустой строки мы используем newline=""создайте имена полей (имена столбцов), используя список, например:

fields=["Names","Age","Class"]

Затем примените к экземпляру писателя, например:

writer=csv.DictWriter(file_writer,fieldnames=fields)

Здесь, используя редактор словаря и присваивая имена столбцам, для записи имен столбцов в csv мы используем writer.writeheader() и для записи значений мы используем writer.writerow({"Names":"John","Age":20,"Class":"12A"}), при записи значений файла необходимо передавать с использованием метода словаря, здесь ключ - это имя столбца, а значение - ваше соответствующее значение ключа.

Импортировать csv:

with open("D:\sample.csv","w",newline="") as file_writer:

fields=["Names","Age","Class"]

writer=csv.DictWriter(file_writer,fieldnames=fields)

writer.writeheader()

writer.writerow({"Names":"John","Age":21,"Class":"12A"})
import csv
with open(fileLocation+'example.csv',newline='') as File: #the csv file is stored in a File object

    reader=csv.reader(File)       #csv.reader is used to read a file
    for row in reader:
        print(row)

Я написал вопрос, спрашивая что-то подобное. Итак, чтобы все было в одном месте, вот мои 2 цента за очень быстрое и грязное решение.

Этот код предназначен для чтения из одного файла CSV и записи в другой. Формат выходной строки фиксирован, я мог бы использовать csv.write с правильным разделителем, но в этом случае мне пришлось бы проделать дополнительную работу, чтобы указать пробелы. Но он отлично работает, чтобы показать, как выводить текст, используя старую добрую функцию print():

      #! /usr/bin/env python3

def main():
    parser = argparse.ArgumentParser(
        description='',
        usage="""myparser [-h] print this help and exit
        """,
        formatter_class=argparse.ArgumentDefaultsHelpFormatter
    )
    parser.add_argument('-f', '--file',help='CSV input file', required=True)
  
    args = parser.parse_args()

    with open("output.file", "w") as outfile:

        with open(args.file) as csvfile:
       
            csv_reader = csv.reader(csvfile, delimiter=',')
            line_count = 0
            for row in csv_reader:
                if line_count == 0:
                    line_count += 1
               elif args.archive:
                    print(f'no:{row[0]}:{row[1]}::0:0:0:/bin/bash:0:0:{row[2]}:{row[3]}:{row[4]}:archive', file=outfile)
                    line_count += 1 

return sys.exit(EXIT_SUCCESS)

if __name__ == '__main__':
    main()
   

Извините за отступ.

Этот код открывает файл CSV для чтения и использует функцию print() для записи отформатированной строки, которая будет выглядеть так:

      no:Xoero:ToelAs:xtoelas:0:0:0:/bin/bash:0:0:y.r.j.pols@tue.nl:00311234567890:nl:archive
Другие вопросы по тегам