Извлечение определенных строк и целых чисел из CSV-файла и запись их в файл .txt с помощью python

#python #csv #pdf

#питон #csv #PDF

Вопрос:

НОВОЕ обновление 11:30 утра по восточному времени Ниже приведен мой полный код

Желаемыми результатами будут файлы txt в этом формате:

Логический идентификатор: (amp;) 192.168.xx.xxx (если в нем есть и то, и другое)

192.168.xx.xxx

Логический идентификатор:

192.168.xx.xxx

192.168.xx.xxx

Логический идентификатор:

Логический идентификатор:

192.168.xx.xxx

**Последний код-gt; Я хочу напечатать ЛОГИЧЕСКИЙ идентификатор, если он существует, если нет, я хочу, чтобы он напечатал IP-адрес (в новой форме).

Код показывает, что я указал файл model.csv для записи в model.txt и придется вручную менять его модель за моделью. Так что, если для этого есть решение, это тоже было бы здорово

 import csv import re import sys  sys.stdout = open("C:\Users\ADMIN-SURV\Desktop\data_pull\2.0C-H4A-DC2 .txt", 'w') with open('C:\Users\ADMIN-SURV\Desktop\data_pull\2.0C-H4A-DC2_filter.csv') as fid:  inputfile = csv.reader(fid)  for row in inputfile:  if len(row) gt;= 4:  if row[0] == 'File name':  # skip the header row  continue  m = re.match(r".*(.* [0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3})", row[3])  if m:  print(m.group(1))  else:  print(row[3])  sys.stdout.close()  

*** строка синтаксического анализа ошибки: модель не найдена H4SL-D1(2305854) Avigilon (ONVIF) 1.3 C-H4SL-D1 Неизвестно 192.168.50.250 00:18:85:***

*** строка синтаксического анализа ошибки: модель не найдена H4SL-D1(2878617) Avigilon (ONVIF) 1.3 C-H4SL-D1 Неизвестно 192.168.50.194 00:18:85:***

Avigilon (ONVIF) 1.3 C-H4SL-D1 Неизвестен Логический идентификатор:1026 *** строка синтаксического анализа ошибки: модель не найдена Неподдерживаемая SOUTH LV Avigilon (ONVIF) 1.3 C-H4SL-D1 Неизвестна 192.168.206.250 00:18:85:***

Avigilon (ONVIF) 1.3C-H4SL-D1 Unknown Logical ID:3027 *** error parsing line: model not found ELEVATOR GROUND FL Avigilon (ONVIF) 1.3C-H4SL-D1 Unknown 192.168.80.203 00:18:85:***

Of course, that is a small chunk of the return.

I want to add that the CSV file is actually specifically for the model specifically, so all I actually have to do is pull the logical ID’s out of the first column and add them to a list under the defined mode and if there is no Logical ID attached, then return the IP address that is given.

I searched for all instances of an item and saved the results as a CSV file. I am using python to try and grab specific information. I would love to add a photo but I am not allowed.

This is the error i am receiving

Traceback (most recent call last): File «C:UsersADMIN-SURVPycharmProjectspdf_scrapingtest_file.,py», line 7, in print(column[3]) IndexError: list index out of range

This is the only code I have written:

 import csv  inputfile = csv.reader(open('C:\Users\ADMIN-SURV\Desktop\data_pull\Untitled.csv','r'))  for column in inputfile:  print(column[3])  

When I get rid of the [3] in the last line and just leave

 print(column)  

It prints my entire CSV file in the console. All I want is specific information from each row and I can get that info by grabbing it from a specific column.

The CSV file data looks like this:

 Search Results"  "Summary" "Saved on","12/8/2021 1:57:21 PM" "Searched for","Avigilon (ONVIF) 1.3C-H4SL-D1" "In document","C:UsersADMIN-SURVDesktopdata_pullIslandView.pdf" "Number of document(s) found","1"  "Number of instance(s) found","551"   "File name","Title","Page","Search Instance" "IslandView.pdf","","5","Detection: Unsupported 2058 Avigilon (ONVIF) 1.3C-H4SL-D1 Unknown Logical ID:2058 192.168.202.206 " "IslandView.pdf","","9","BAR POS 01 Avigilon (ONVIF) 1.3C-H4SL-D1 Unknown 192.168.70.214 00:18:85:" "IslandView.pdf","","9","H4SL-D1(1866954) Avigilon (ONVIF) 1.3C-H4SL-D1 Unknown Logical ID:481 192.168.11.203 " "IslandView.pdf","","9","H4SL-D1(1825930) Avigilon (ONVIF) 1.3C-H4SL-D1 Unknown Logical ID:20 192.168.16.203 " "IslandView.pdf","","9","Detection: Unsupported 2048 Avigilon (ONVIF) 1.3C-H4SL-D1 Unknown 192.168.202.200 00:18:85:" "IslandView.pdf","","9","H4SL-D1(1866877) Avigilon (ONVIF) 1.3C-H4SL-D1 Unknown Logical ID:92 192.168.15.205 " "IslandView.pdf","","9","Detection: Unsupported 2074 Avigilon (ONVIF) 1.3C-H4SL-D1 Unknown Logical ID:2074 192.168.203.241 " "IslandView.pdf","","9","Detection: Unsupported 2174 Avigilon (ONVIF) 1.3C-H4SL-D1 Unknown Logical ID:2174 192.168.201.232 " "IslandView.pdf","","9","Detection: Unsupported 2161 Avigilon (ONVIF) 1.3C-H4SL-D1 Unknown Logical ID:2161 192.168.205.231 "  

there are over 500 lines. You can see the column headers

 "File name","Title","Page","Search Instance"   

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

На всякий случай, это пример номера модели и логического идентификатора из столбца 1

Avigilon (ONVIF) 1.3 C-H4SL-D1 Логический идентификатор: 875

Конечная цель состоит в том, чтобы создать лист, на котором указана каждая модель (это результаты поиска для одной модели), а под этим списком перечислены ВСЕ логические идентификаторы, связанные с этой моделью.

Дайте мне знать, если я смогу уточнить или предоставить какую-либо дополнительную информацию.

Спасибо!

Ответ №1:

Верхняя часть вашего CSV-файла содержит строки с менее чем 4 столбцами. Чтобы избежать ошибки IndexError, сначала попробуйте проверить длину строки:

 # "inputfile" is a CSV reader instance for row in inputfile:  if len(row) gt;= 4:  print(row[3])  

Вот вариант, в котором используется регулярное выражение для выделения имени модели, останавливающееся на IP-адресе:

 import re  with open('example_data.csv') as fid:  inputfile = csv.reader(fid)  for row in inputfile:  if len(row) gt;= 4:  if row[0] == 'File name':  # skip the header row  continue  m = re.match(r'.*(Avigilon.* [0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3})', row[3])  if m:  print(m.group(1))  else:  print(f'*** error parsing line: model not found {row[3]}***')  

который для приведенных выше данных печатает:

 Avigilon (ONVIF) 1.3C-H4SL-D1 Unknown Logical ID:2058 192.168.202.206 Avigilon (ONVIF) 1.3C-H4SL-D1 Unknown 192.168.70.214 Avigilon (ONVIF) 1.3C-H4SL-D1 Unknown Logical ID:481 192.168.11.203 Avigilon (ONVIF) 1.3C-H4SL-D1 Unknown Logical ID:20 192.168.16.203 Avigilon (ONVIF) 1.3C-H4SL-D1 Unknown 192.168.202.200 Avigilon (ONVIF) 1.3C-H4SL-D1 Unknown Logical ID:92 192.168.15.205 Avigilon (ONVIF) 1.3C-H4SL-D1 Unknown Logical ID:2074 192.168.203.241 Avigilon (ONVIF) 1.3C-H4SL-D1 Unknown Logical ID:2174 192.168.201.232 Avigilon (ONVIF) 1.3C-H4SL-D1 Unknown Logical ID:2161 192.168.205.231 Avigilon (ONVIF) 1.3C-H4SL-D1 Unknown 192.168.50.246  

Чтобы записать выходные данные в текстовый файл, попробуйте сделать что-то вроде этого:

 with open('logfile.txt', 'w') as fout:  with open('example_data.csv') as fid:  inputfile = csv.reader(fid)  for row in inputfile:  if len(row) gt;= 4:  if row[0] == 'File name':  # skip the header row  continue  m = re.match(r'.*(Avigilon.* [0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3})', row[3])  if m:  # optional: delete this print line  print(m.group(1))  fout.write(f'{m.group(1)}n')  else:  print(f'*** error parsing line: model not found {row[3]}***')  

Комментарии:

1. Я начну работать над этим прямо сейчас! Спасибо

2. Я получаю это при запуске точного кода, который вы написали. «*** строка синтаксического анализа ошибки: модель не найдена H4SL-D1(2210685) Avigilon (ONVIF) 1.3 C-H4SL-D1 Неизвестно 192.168.50.246 00:18:85:***»

3. и если логического идентификатора нет, как я могу заставить его прочитать IP-адрес в другом столбце? Я сейчас читаю о регулярных выражениях, у меня очень мало знаний о python. Я действительно ценю это и хотел бы, чтобы вы ответили!

4. @dschulz1227 — вместо этого ответ обновлен, чтобы соответствовать IP-адресу

5. вам тоже нужен IP-адрес? если вы переместите правую») «(в настоящее время после Avigilon.* ) на «после последнего [0-9]{1,3} «, IP-адрес будет напечатан вместе с остальными.