Как прочитать первые 100 строк CSV-файла в Python с добавлением запятой, серийного номера и знаков полной остановки? - PullRequest
0 голосов
/ 15 июня 2019

Предположим, у меня есть 2 столбца и 3000 строк в CSV-файле. Я хочу прочитать только первые 100 строк файла CSV, где мне нужно добавить запятую (,) после первого столбца и нужно ввести точку (.), чтобы завершить строку. Есть ли способ добиться того же. Кроме того, мне нужно включить серийный номер, прежде чем читать первый ряд. Как этого добиться?

Формат ввода:

question              answer
what is your name     i am maxi
are you happy         yes i am
what you do           i am a student

Выход:

1. what is your name, i am maxi.
2. are you happy, yes i am.
3. what you do, i am a student.

код, который я пробовал, выглядит следующим образом.

import csv
import itertools

with open('data.csv', 'r') as f:
   mycsv = csv.reader(f)
   next(mycsv, None)
   for row in itertools.islice(mycsv, 100):
       row = ('"{}."'.format(', '.join(row)) for row in mycsv)

       raw_text = ', '.join(row)
       print(raw_text)

Ответы [ 3 ]

2 голосов
/ 15 июня 2019

Предполагая, что ключевые поля разделены несколькими пробелами:

import re

with open('test.csv', 'r') as f:
    next(f)
    pat = re.compile(r'\s{2,}')

    for i, row in enumerate(f, 1):
        print('{}. {}.'.format(i, pat.sub(', ', row.strip(), 1)))
        if i == 100: break

Regex \s{2,} подробности:

  • \s - символ пробела
  • {2,} - {n, m}, где n> = 0 и m> = n . Повторяет предыдущий элемент от n до m раз. Жадный, поэтому повторяется m раз, прежде чем уменьшить повторение до n раз. Ex. a{2,4} совпадений aaaa, aaa или aa

Пример вывода:

1. what is your name, i am maxi.
2. are you happy, yes i am.
3. what you do, i am a student.
1 голос
/ 15 июня 2019

Вариант без регулярного выражения Ответ Романа Перехреста :

Создание демонстрационных данных:

with open("data.csv","w") as f: 
    f.write(f"""question              answer
what is your name     i am maxi
are you happy         yes i am
what you do           i am a student
""") 
    for i in range(10): # 30some more lines
        f.write(f"""what is your name     i am maxi
are you happy         yes i am
what you do           i am a student
""") 

Данные процесса:

with open('data.csv', 'r') as f:
    next(f) # skip header
    skipped = 0
    for number, line in enumerate(f,1):
        if line.strip():
            a,b = line.split("  ",1) # split at 2 spaces
            print(f"{number-skipped}. {a.strip()}, {b.strip()}.")
        else: 
            skipped += 1
        if number == 10: # reduced to 10 due to output lenght 
              break

Вывод:

1. what is your name, i am maxi.
2. are you happy, yes i am.
3. what you do, i am a student.
4. what is your name, i am maxi.
5. are you happy, yes i am.
6. what you do, i am a student.
7. what is your name, i am maxi.
8. are you happy, yes i am.
9. what you do, i am a student.
10. what is your name, i am maxi.

Это должно даже корректно обрабатывать пустые строки в ваших данных.

0 голосов
/ 15 июня 2019

Простая в использовании библиотека панд:

import pandas as pd
# to load data from file
df = pd.read_csv("data.csv")
# test data
df = pd.DataFrame({"question": ['what is your name', 'are you happy', 'what you do '],
                   "answer": ["i am maxi", "yes i am", "i am a student"]})

# get fist 100 rows
df = df[:100]
# set numbers
df['number'] = np.arange(1,len(df)+1).astype(str)

df['summary'] = df['number'] + '. ' + df['question'] + ', ' + df['answer'] + '.'

Выход:

            question          answer number                          summary
0  what is your name       i am maxi      1  1. what is your name, i am maxi.
1      are you happy        yes i am      2       2. are you happy, yes i am.
2       what you do   i am a student      3  3. what you do , i am a student.
...