#python #string #search #printing #character
Вопрос:
Я недавно начал изучать программирование, и теперь я использую python для фильтрации данных. Мой вопрос: как мне получить строку внутри определенного символа? например, в текстовом файле у меня есть что-то вроде этого:
5d:6g:9h:5t:7a:45;33:12:5B:9J;70;9C;89;85:4B:38:16:9B:45:56:85:
и я хочу , чтобы строка содержала 10-й символ ; ;
или 15-й : :
Я прочитал файл txt, я получил некоторую информацию, но эту часть в частности я не могу понять. Вот что у меня есть до сих пор:
import zipfile
arq = zipfile.ZipFile('DSts.zip')
for file in arq.namelist():
print(file)
f = arq.open(file)
Lines = f.readlines()
for line in Lines:
print(f'{line[11:16]}')
Ответ №1:
Это решение, которое вы можете интегрировать в свой код. Вы бы применили его к каждой прочитанной вами строке (или к каждой строке, которую, по вашему мнению, необходимо проанализировать подобным образом).,
def get_substring(input_string, delim, nth, delims):
''' Returns the substring between the nth character
delim in the string and next such character;
delims is a list of all delimiters to account for '''
# Indices of all occurences of delims
idx_delims = [i for i, x in enumerate(input_string) if x in delims]
# Retrieve the index of nth delim
idx_nth = idx_delims[nth-1]
# Find the index of the nth 1 delim
idx_nth_p1 = input_string.index(delim, idx_nth 1)
# Return the substring between those two positions
return input_string[idx_nth 1:idx_nth_p1]
orig_string = '5d:6g:9h:5t:7a:45;33:12:5B:9J;70;9C;89;85:4B:38:16:9B:45:56:85:'
print(orig_string)
# All delimiters
delims = [':', ';']
# Substring between 10th and 11th :
str_1 = get_substring(orig_string, ';', 10, delims)
print(str_1)
# Substring between 15th and 16th ;
str_2 = get_substring(orig_string, ':', 15, delims)
print(str_2)
Эта функция извлекает все символы, которые считаются разделителями, из входной строки. Затем он находит N-й разделитель в соответствии с запросом и следующий разделитель в исходной строке. Он возвращает строку, которая находится между ними двумя.
На самом деле, это должно иметь некоторую функцию проверки и соответствующие предупреждения, даже исключения (например delim
, существует ли он и находится ли он в запрошенной nth
позиции). Кроме того, это можно было бы написать более сжато, я сделал его длиннее для удобства чтения и понимания. Наконец, вы должны удалить инструкции печати в окончательной версии.
Обновление: Это минимальный код, демонстрирующий интеграцию. Вы можете протестировать его автономно, а затем использовать подход чтения и постобработки вместо open
и readlines
в исходном коде. Ни в том, ни в другом нет ничего плохого, но:
open
пункт нуждается в aclose
иwith open
предоставляет вамclose
закулисье, даже если что-то рухнет.readlines
читает весь файл за один раз. Я часто работаю с большими файлами, поэтому привык экономить оперативную память и обрабатывать строку за строкой. Это зависит от вас и от проблемы, над которой вы работаете.
Итак, вот пример:
def get_substring(input_string, delim, nth, delims):
''' Returns the substring between the nth character
delim in the string and next such character;
delims is a list of all delimiters to account for '''
# Indices of all occurences of delims
idx_delims = [i for i, x in enumerate(input_string) if x in delims]
# Retrieve the index of nth delim
idx_nth = idx_delims[nth-1]
# Find the index of the nth 1 delim
idx_nth_p1 = input_string.index(delim, idx_nth 1)
# Return the substring between those two positions
return input_string[idx_nth 1:idx_nth_p1]
# All delimiters
delims = [':', ';']
all_substrings = []
with open('testfile.txt', 'r') as fin:
for line in fin:
# Remove the leading and trailing whitespace
line = line.strip()
temp_str = get_substring(line, ':', 2, delims)
all_substrings.append(temp_str)
print(all_substrings)
Код очищает конечную новую строку с strip()
помощью и добавляет все подстроки в список.
Одно примечание: то, как вы описали свою проблему, мне показалось, что вы хотели сопоставить определенный разделитель в позиции, которая является количеством всех разделителей, т. Е. Для этого 5d:6g:9h:5t:7a:45;33:12:
разделителем ;
будет 6-й разделитель, поэтому вызов превращается в (line, ';', 6, delims)
. Дайте мне знать, если это не так, но подумайте о том, чтобы настроить его самостоятельно для практики. Это означает, что звонок, о котором вы упомянули в комментарии, должен быть таким же, как здесь, (line, ':', 2, delims)
. Потому :
что это второй разделитель. Также имейте в виду, что индексация Python начинается с 0, так что на самом деле это позиция 1 в idx_delims
списке.
Наконец, это минимальный входной файл для тестирования:
5d:6g:9h:5t:7a:45;33:12:5B:9J;70;9C;89;85:4B:38:16:9B:45:56:85:
5d:6g:9h:4t:7a:45;33:12:5B:9J;70;9C;89;85:4B:38:16:9B:45:56:85:
3d:7g:9i:5t:7a:45;33:12:5B:9J;70;9C;89;85:4B:38:16:9B:45:56:85:
Комментарии:
1. Большое вам спасибо за вашу помощь. Я попытался включить его в свой код, но это не сработало. Поэтому, когда я читаю текстовый файл с несколькими строками, мне придется проверять каждую строку в файле, верно? Итак, вот что я сделал: я поместил строку «orig_string» и «str_1 внутри» цикла следующим образом: (Функция «get_substring» находилась над строками, открывшими файл txt): —> для строки в строках: orig_string = строка str_1 = get_substring(orig_string,’;’, 2, разделители) печать(str_1) > Но это не работает, и появляется следующая ошибка: «Ошибка индекса: индекс списка вне диапазона».
2. @ElleOliver Обновил ответ, дайте мне знать, стал ли он чище сейчас.
3. Попробуйте, и если вы застряли, опубликуйте более подробную информацию о своем файле (это только тип записей, которые вы опубликовали? Есть ли у него заголовки?)
4. Добавлен полный пример, дайте мне знать, если вам понадобится что-нибудь еще.
5. Это сработало именно так, как я хотел, большое вам спасибо!!