Как прочитать файл, когда слова разделены "|"(PSV)? - PullRequest
0 голосов
/ 06 мая 2019

В Python у меня есть файл, слова которого разделены |, например: city|state|zipcode. Мой читатель файла не может отделить слова. Кроме того, я хочу, чтобы моя программа чтения файлов запускалась в строке 2, а не в строке 1. Как мне заставить мою программу чтения файлов разделять слова?

import os
import sys

def file_reader(path, num_fields, seperator = ',', header = False):
    try:
        fp = open(path, "r", encoding="utf-8")
    except FileNotFoundError:
        raise FileNotFoundError("Unable to open file.")
    else:
        with fp:
            for n, line in enumerate(fp, 1):
                fields = line.rstrip('/n').split(seperator)
                if len(fields) != num_fields:
                    raise ValueError("Unable to read file.")
                elif n == 1 and header:
                    continue
                else:
                    yield tuple([f.strip() for f in fields])

Ответы [ 6 ]

0 голосов
/ 06 мая 2019

Мы разделим работу на 3 этапа, читая файл, сохраняя каждую строку файла в списке, разделяя список

Чтение файла В Python вы можете легко прочитать файлиспользуя команду «open» следующим образом:

fp=open("file.txt",'r')

Чтение каждой строки отдельно , чтобы прочитать файл как строки, вы можете использовать команду «readlines» следующим образом:

lines=fp.readline():

это вернет содержимое файла в виде списка, в котором каждая запись представляет строку.Вы также можете прочитать определенную строку, передав номер строки fp.readline(5)

-> Для получения дополнительной информации проверьте чтение файлов в Python Разделение содержимого Дляразделить строки на '|'используйте метод «split»:

for item in lines:
    res=item.split('|')
    #do what you want with res
0 голосов
/ 06 мая 2019

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

В коде поведение по умолчанию -используйте , в качестве разделителя, чтобы не пропустить первую строку файла.Чтобы на самом деле разделить с помощью | и пропустить первую строку (то есть заголовок), тогда мы установим seperator='|' и header = True, когда мы ее вызовем.

# Function is fine, leave as-is
#
def file_reader(path, num_fields, seperator = ',', header = False):
    try:
        fp = open(path, "r", encoding="utf-8")
    except FileNotFoundError:
        raise FileNotFoundError("Unable to open file.")
    else:
        with fp:
            for n, line in enumerate(fp, 1):
                fields = line.rstrip('/n').split(seperator)
                if len(fields) != num_fields:
                    raise ValueError("Unable to read file.")
                elif n == 1 and header:
                    continue
                else:
                    yield tuple([f.strip() for f in fields])

# Example file afile.txt contains these lines:
# alfa|beta|gamma|delta
# 1|2|3|4
# a|b|c|d

# here we call the function:

filename = 'afile.txt'
for x in file_reader(filename, 4, '|', True):  #note the separator and header
    print(x)
0 голосов
/ 06 мая 2019

Если вы хотите, чтобы опция ultra shoddy ++ пропускала перечисление первого значения: сделайте логическое значение инициализированным как true, а затем добавьте оператор if в начале цикла for, который проверяет, является ли это логическое значение true.Внутри этого оператора if установите значение false, а затем передайте continue

Что-то вроде:

b = True
for k, v in enumerator:
  if b:
    b = False
    continue
  # Some code
0 голосов
/ 06 мая 2019

если вам нужно прочитать со второй строки, вы можете изменить код с: for n, line in enumerate(fp, 1) на for n, line in enumerate(fp[1:], 1)

0 голосов
/ 06 мая 2019

Если вы не возражаете против использования существующего фреймворка, вы можете использовать панд. Вы можете пропустить первую строку, используя skiprows = 1, и изменить разделитель, используя sep = '|'

# load pandas
import pandas as pd

# read file as pandas dataframe
dataframe = pd.read_csv(file,skiprows=1,sep='|')
print(dataframe)

Для установки панд

pip install pandas

Документация Pandas для read_csv

https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.read_csv.html

Другой вариант - использовать csv reader для чтения вашего psv файла

import csv

with open('file.psv') as csv_file:
    csv_reader = csv.reader(csv_file, delimiter='|')
    next(csv_reader, None)  # read once to skip the header once

    for row in csv_reader:
            print(row)
0 голосов
/ 06 мая 2019

Если вы используете [1:-1] (я думаю), вы можете выбрать подмассив, который начинается после первого значения массива, что в случае файла должно означать, что вы получаете каждую строку, кроме первой.

...