Datei auslesen, Datei Encoding nicht bekannt / eindeutig

FAN4TIC

Lt. Commander
Registriert
Nov. 2007
Beiträge
1.738
Hallo Community :)

ich hab ein Problem beim Auslesen und verarbeiten einer Datei:
Im Rahmen einer Projektarbeit arbeite ich mit den SQL dumps der englischen Wikipedia. Ich arbeite primär mit 2 dumps:

enwiki-20160720-pagelinks.sql.gz
Aufbau:
Code:
DROP TABLE IF EXISTS `pagelinks`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `pagelinks` (
  `pl_from` int(8) unsigned NOT NULL DEFAULT '0',
  `pl_namespace` int(11) NOT NULL DEFAULT '0',
  `pl_title` varbinary(255) NOT NULL DEFAULT '',
  UNIQUE KEY `pl_from` (`pl_from`,`pl_namespace`,`pl_title`),
  KEY `pl_namespace` (`pl_namespace`,`pl_title`,`pl_from`)
) ENGINE=InnoDB DEFAULT CHARSET=binary;
/*!40101 SET character_set_client = @saved_cs_client */;


INSERT INTO `pagelinks` VALUES (10,0,'Computer_accessibility'),(12,0,'-ism'),(12,0,'1848_Revolution'),(12,0,'1917_October_Revolution'),(12,0,'1919_United_States_anarchist_bombings'),(12,0,'19th_century_philosophy')

enwiki-20160720-page.sql.gz

Aufbau:
Code:
DROP TABLE IF EXISTS `page`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `page` (
  `page_id` int(8) unsigned NOT NULL AUTO_INCREMENT,
  `page_namespace` int(11) NOT NULL DEFAULT '0',
  `page_title` varbinary(255) NOT NULL DEFAULT '',
  `page_restrictions` tinyblob NOT NULL,
  `page_counter` bigint(20) unsigned NOT NULL DEFAULT '0',
  `page_is_redirect` tinyint(1) unsigned NOT NULL DEFAULT '0',
  `page_is_new` tinyint(1) unsigned NOT NULL DEFAULT '0',
  `page_random` double unsigned NOT NULL DEFAULT '0',
  `page_touched` varbinary(14) NOT NULL DEFAULT '',
  `page_links_updated` varbinary(14) DEFAULT NULL,
  `page_latest` int(8) unsigned NOT NULL DEFAULT '0',
  `page_len` int(8) unsigned NOT NULL DEFAULT '0',
  PRIMARY KEY (`page_id`),
  UNIQUE KEY `name_title` (`page_namespace`,`page_title`),
  KEY `page_random` (`page_random`),
  KEY `page_len` (`page_len`),
  KEY `page_redirect_namespace_len` (`page_is_redirect`,`page_namespace`,`page_len`)
) ENGINE=InnoDB AUTO_INCREMENT=41532769 DEFAULT CHARSET=binary;
/*!40101 SET character_set_client = @saved_cs_client */;

INSERT INTO `page` VALUES (10,0,'AccessibleComputing','',0,1,0,0.33167112649574004,'20131223211334',NULL,381202555,57),(12,0,'Anarchism','',5252,0,0,0.786172332974311,'20140102071601',NULL,588758487,173521),


Grobe Erläuterung der Tabellen:

Die Tabelle pagelinks.sql enthält Informationen, welcher Artikel zu welchem anderen Artikel verlinkt. Die wichtigen Spalten dafür sind pl_from und pl_title.


Der Wikipedia Artikel mit der ID pl_from verweist mit einem seiner Links auf den Artikel mit dem Tittel pl_title

Die Tabelle in page.sql enthält Informationen über die Wikipedia-Artikel selbst, darunter auch ID und Titel, jeden Artikels.
Die hab ich bereits ausgelesen und ein Dictionary gebaut:
Key: Artkel-Titel
Value: Artikel-ID


Ich muss aus den Informationen von pagelinks einen Graphen bauen. Zuvor muss ich, die Titel, die in pl_title stehen, mithilfe meines dictionaries in IDs umwandeln.

Folgender Code wird fürs Lesen, beider dumps, verwendet:
Code:
cnt = 0
sql_file = gzip.open(file_name, 'rb')
while True:
        try:
            
            line = sql_file.readline().decode('utf-8')
        
        except UnicodeDecodeError:
            cnt += 1
            continue
print (cnt)
Die Datei page.sql.gz wird problemlos gelesen.
Das Problem tritt bein Lesen der pagelinks.sql.gz auf. Viele Zeilen können nicht gelesen werden, weil sie anscheinend einzelne Symbole enthalten, die nicht mit utf-8 dekodiert werden können.
Wenn ich die Datei, wie im Code, öffne, werden etwa 70 Zeilen nicht gelesen. Öffne ich sie im Text-Modus mit 'rt' und
encoding ='utf-8' sind es ~750 unlesbare Zeilen.

Wie gehe ich dieses Problem an? Da es pro Zeile, etwa 4000 Inserts sind, betrifft das eine Menge Daten, die ich nicht, einfach so, ignorieren möchte.
Ich würde gern ohne eine MySQL Datenbank auskommen, falls der Vorschlag kommt, das doch in eine DB einzulesen. :)

Danke schon einmal im voraus


LG




PS:
ich werd später selbst weiterprobieren, aber jetzt erstmal schlafen. :o
Vielleicht findet sich jemand mit einer hilfreichen Antwort. Falls ich irgendwelche wichtigen Infos vergessen hab oder dumme Fehler sind, ist die Müdigkeit schuld :p
 
Kannst du mal ein Beispiel eines "kaputten" Eintrags geben? Imho musst du eine Sonderbehandlung für die nicht erkannten Zeichen schreiben, Die Wikipedia wird sich für dich nicht ändern.
 
Zurück
Oben