2015-07-07 2 views
0

У меня есть большой файл из запатентованного формата архива. Распаковка этого архива дает файл, который не имеет расширения, но внутренние данные разделены запятыми. Добавление расширения .csv или просто открытие файла с помощью Excel будет работать.Извлечение строк данных из CSV-файла с использованием Python

У меня около 375-400 из этих файлов, и я пытаюсь извлечь кусок строк (около 13 500 из 1.2M + строк) между ключевым словом «точка А» и другим словом «точка B».

Я нашел код на этом сайте, я думаю, правильно извлекая данные, но я получаю сообщение об ошибке:

AttributeError: 'list' object has no attribute 'rows' при попытке сохранить в файл. Может ли кто-нибудь помочь мне получить эти данные для сохранения в csv?

import re 
import csv 
import time 

print(time.ctime()) 

file = open('C:/Users/User/Desktop/File with No Extension That\'s Very Similar to CSV', 'r') 
data = file.read() 
x = re.findall(r'Point A(.*?)Point B', data,re.DOTALL) 

name = "C:/Users/User/Desktop/testoutput.csv" 
with open(name, 'w', newline='') as file2: 
    savefile = csv.writer(file2) 
    for i in x.rows: 
     savefile.writerow([cell.value for cell in i]) 

print(time.ctime()) 

Заранее спасибо, любая помощь будет очень признательна.

+2

're.findall()' возвращает список. Ошибка сообщает вам, что объекты 'list' не имеют атрибута' rows'.Вы должны посмотреть, что содержит 'x' и посмотреть, что вы можете сделать оттуда – Kreger51

+2

Не могли бы вы [изменить] ваш вопрос и исправить кавычки? Извините, я придираюсь, но человек с раскраской неправильно сбивает с толку. – NightShadeQueen

ответ

2

Следующие должны работать хорошо. Как уже упоминалось, использование вашего регулярного выражения было почти правильным. Можно еще использовать библиотеку Python CSV, чтобы сделать обработку CSV путем преобразования найденного текста в объект StringIO и попутно, что для читателя CSV:

import re 
import csv 
import time 
import StringIO 

print(time.ctime()) 

input_name = "C:/Users/User/Desktop/File with No Extension That's Very Similar to CSV" 
output_name = "C:/Users/User/Desktop/testoutput.csv" 

with open(input_name, 'r') as f_input, open(output_name, 'wb') as f_output: 
    # Read whole file in 
    all_input = f_input.read() 

    # Extract interesting lines 
    ab_input = re.findall(r'Point A(.*?)Point B', all_input, re.DOTALL)[0] 

    # Convert into a file object and parse using the CSV reader 
    fab_input = StringIO.StringIO(ab_input) 
    csv_input = csv.reader(fab_input) 
    csv_output = csv.writer(f_output) 

    # Iterate a row at a time from the input 
    for input_row in csv_input: 
     # Skip any empty rows 
     if input_row: 
      # Write row at a time to the output 
      csv_output.writerow(input_row) 

print(time.ctime()) 

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

Протестировано с использованием Python 2.7

+0

Спасибо! Поставил меня в правильном направлении. – David

+0

Привет, Мартин, у меня было быстрое наблюдение, если вы не возражаете, чтобы я спросил. Если бы мне пришлось изменить команду re.findall, чтобы перейти от «Точка А» к концу файла, как бы я это сделал? Я использовал это совсем немного, но форматы файлов изменились, и больше нет точки «Точка B» для конечной позиции. Благодаря! – David

+1

Вы можете попробовать изменить его на 'r'Point A (. *) '' –

1

У вас здесь есть 2 проблемы: первая связана с регулярным выражением, а другая - с синтаксисом списка.

  1. Получение, что вы хотите

    То, как вы используете регулярное выражение вернет вам список с одним значением (все строки в уникальную строку).

    Возможно есть лучший способ сделать это, но я бы сейчас с чем-то вроде этого:

    with open('bla', 'r') as input: 
        data = input.read() 
        x = re.findall(r'Point A(.*?)Point B', data, re.DOTALL)[0] 
        x = x.splitlines(False)[1:] 
    

    Это не красиво, но возвращает список со всеми значениями между этими двумя точками.

  2. Работа со списками

    Там нет rows атрибута внутри списков. Вы просто должны итерацию над ней:

    for i in x: 
        do what you have to do 
    

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

ИМХО, я бы не использовать формат CSV, так как это своего рода «локали зависимый», поэтому он не может работать, как ожидалось в зависимости настроек конечные пользователи могут иметь ОС.

Смежные вопросы