Строка, содержащая специальные символы, выделяется в новом столбце при их разборе - PullRequest
0 голосов
/ 03 января 2019

У меня проблема при разборе http-запросов.У меня есть такие данные в .txt по ссылке

https://drive.google.com/open?id=1RSyCYgxBCJnxAXDInyIs1cOp_3EoUyqG

Я пытаюсь преобразовать эти данные в формат CSV, но специальные символы, такие как ';'разделить данные на новые столбцы

Пример: данные в столбце «Принять» должны выглядеть следующим образом: текст / xml; q = 0,6, application / rtf; q = 0,7, изображение / *

но когда я выполняю код, я получаю данные в этом столбце в виде text / xml и q = 0,6 выходит в новый столбец.

Единственное решение, которое я нашел, было преобразовать строку одинарных кавычек в двойные кавычкии затем сохранил строку, но это не сработало. из

from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.model_selection import train_test_split
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
import urllib.parse
from sklearn import tree
from sklearn.ensemble import RandomForestClassifier
import io
from sklearn.svm import LinearSVC
from sklearn.metrics import confusion_matrix
import os
import json
import csv
from itertools import islice
import numpy as np
import pandas as pd


fields = ['Start - Id', 'class', 'Method', 'Url', 'Protocol', 'Content-   Length','Content-Language','Content-Encoding','Content-Location','Content-MD5','Content-Type','Expires','Last-Modified', 'Host', 'Connection', 'Accept', 'Accept-Charset', 'Accept-Encoding', 'Accept-Language', 'Cache-Control','Client-ip', 'Cookie', 'Cookie2', 'Date', 'ETag', 'Expect', 'From', 'If-Modified-Since', 'If-Unmodified-Since', 'If-Match', 'If-None-Match', 'If-Range','Max-Forwards', 'MIME-Version', 'Pragma', 'Proxy-Authorization', 'Authorization', 'Range', 'Referer', 'TE', 'Trailer', 'User-Agent', 'UA-CPU', 'UA-Disp', 'UA-OS', 'UA-Color', 'UA-Pixels', 'Via', 'Transfer-Encoding', 'Upgrade', 'Warning', 'X-Forwarded-For', 'X-Serial-Number', '~~~~~','----']

listofKeys = dict.fromkeys(fields)

def init(file_out):
    with open(file_out, 'w', encoding="utf-8") as csvfile:
        csvwriter = csv.writer(csvfile, delimiter="\t")
        csvwriter.writerow(fields)

def write(file_out, lines):
    with open(file_out, 'a', encoding="utf-8")  as csvfile:
        csvwriter = csv.writer(csvfile, delimiter ="\t")
        row = []
        N = len(lines)
        foundP = False
        for i in range(N-1):
            line = lines[i].strip()
            if len(line)>0:
                if i==2:
                    listofKeys['Method'] = line.split(" ")[0]
                    listofKeys['Url'] = line.split(" ")[1]
                    listofKeys['Protocol'] = line.split(" ")[2]
                    if(line.startswith("PUT") or line.startswith("POST")):
                        foundP = True
                elif i==N-3 :
                    if foundP == True:
                        listofKeys['Url'] += (line)
                else:
                    index = line.find(':')
                    key = line[0:index].strip()
                    value = line[index+1:].strip()
                    listofKeys[key] = str(value)
        for keys in fields:
            row.append(listofKeys[keys])
        print(type(row))

        print(row)
        csvwriter.writerow(row)


def convertText2Csv(file_in, file_out):
    init(file_out)
    with open(file_in, 'r') as infile:
        lines = []
        count = 0
        for line in infile:
            if line.startswith("Start"):
                count+=1
                print("-------------------------------------------------------------------Request #",count," -------------------------------------------------------------------------")
                lines.append(line)
            elif line.startswith("End"):
                lines.append(line)
                write(file_out, lines)
                lines = []
            else:
                lines.append(line)

csvFile = 'test.csv'
textFile = 'test.txt'
convertText2Csv(textFile, csvFile)

Результат, который я получаю, приведен в ссылке https://drive.google.com/open?id=1rLPdbuZkS6pcDQqHZZP6ck9H8XbnMPWM

Я просто хочу преобразовать данныев CSV-файл с каждым столбцом, содержащим определенное значение со специальными символами, если оно присутствует

1 Ответ

0 голосов
/ 03 января 2019

Ваш CSV-файл совершенно корректен.

Вот содержимое столбца Accept при его загрузке в Libre Office calc и указании "\ t" в качестве единственного разделителя :

Accept
*/*
*/*
*/*
text/xml;q=0.6, application/rtf;q=0.7, image/*

Ваша настоящая проблема в том, что программа, которую вы используете для открытия файла csv, слишком умная (на самом деле ... ошибочно!): Она предполагает, что пользователи слишкомглупо знать, что такое разделитель, и пытаться их угадать.И здесь он сделал неверное предположение, предполагая, что ; тоже был разделителем.

Короче говоря: вы просто пытаетесь отобразить правильный файл CSV с помощью глупой программы для работы с листами (это может быть Excel?),Excel - очень хороший инструмент, за исключением тех случаев, когда речь идет о CSV-файлах, где это просто дерьмо.

Как вам было предложено в комментариях, опция quoting=csv.QUOTE_ALL , которая должна быть здесь бесполезна ,может быть достаточно объяснить этот кусок дерьма, что он должен игнорировать может разделители в полях ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...