Чтение строки внутри определенного символа с помощью python

#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 пункт нуждается в a close и 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. Это сработало именно так, как я хотел, большое вам спасибо!!