TypeError: invalid file

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Nobuddy
User
Beiträge: 1023
Registriert: Montag 30. Januar 2012, 16:38

Hallo zusammen

Habe da ein Datenproblem mit einer Access-Liste, die TAB-getrennt ist.
Das Problem selbst scheint darin zu liegen, daß in einzelnen Spalten Zeilenumbrüche vorhanden sind, was zu dieser Fehlermeldung führt.

Hier ein Beispiel, einews einzelenen Datensatzes:
70,00 70,00 70 70 Fa. AHA Dienstleistungs GmnbH
Leergut Herr Hen Leergutankauf Ankerer. 60 04711 Fledder 0,00 Herr Hen
0000 00000000
0000 00000000 Frau Pau 0000 00000000 Leergut-Nr. 0000 immer angeben

Abholung, frei Haus ab 0 €
Ab 20,- € wird Vergütung gut geschrieben, darunter entfällt eine Gutschrift!

Abrechnungen/Gutschriften etc.:
Frau Pau
Tel. 0000 00000000
Fax 0000 0000000
pau@pau-box.de

Logistik (Lieferungen/Abholungen etc.):
Herr Hen
Tel. 0000 0000
Fax 0000 0000
hen@hen-box.de 0,00 € 0,00 € 0,00 0,00 € 0,00 0,00 0,00 € 0 Sofort 0 1 Auftraggeber bei Abholung:
LOL - Grüne Umweltbox
Ankerer. 60
04711 Fledder

Alte Firmierung:
OHO, Entsorgungs-Zentrum GmbH, Wikinger. 138, 04711 Köln
Tel.: 0000 00000000
Fax: 0000 00000000 0 2006 1.1.2006 00:00:00 0000 0 33,25 € 44,60 € 0 0 1
Die Fehlermeldung, bezieht sichschon auf die erste Zeile des Codes:

Code: Alles auswählen

    with codecs.open(op_kunden_access_path, "r") as infile:
        reader = csv.reader(infile, delimiter="\t", quotechar="^")
        for row in reader:
Da es zu viele Datensätze in dieser Liste sind, um ein manuelles Beheben durchzuführen, hoffe ich auf einen guten Vorschlag Eurer Seite.

Gibt es da eine Möglichkeit, die Liste in eine CSV-Datei zu importieren?
Oder vielleicht habt Ihr auch andere Vorschläge?

Grüße Nobuddy
Zuletzt geändert von Nobuddy am Freitag 30. November 2012, 17:00, insgesamt 1-mal geändert.
Nobuddy
User
Beiträge: 1023
Registriert: Montag 30. Januar 2012, 16:38

Ich glaube, das kann ich nur in MS ACCESS selbst lösen, in dem ich die Spalten mit Zeilenumbruch, durch z.B. einem Leerzeichen ersetze. Dann sollte es mit der Liste einlesen wieder funktionieren.

Nachtrag:
Problem ist gelöst. Habe in MS ACCESS mit

Code: Alles auswählen

Replace([Namen];Zchn(13) & Zchn(10);" ")
die zeilenumbrüche eliminiert. :lol:
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Hallo.

Dein zeit mal, was in ``op_kunden_access_path`` steht. Ich tippe auf eine Escape-Sequenz.

Warum versuchst due die gezeigte Datei überhaupt mit dem csv-Modul zu öffnen? Die hat mit csv-Dateien nun so gar nichts zu tun.

Und wie bei jedem Post von dir: Poste die gesamte Fehlermeldung inklusive Traceback, nicht nur den Teil, den du für wichtig hältst.

Sebastian
Das Leben ist wie ein Tennisball.
Nobuddy
User
Beiträge: 1023
Registriert: Montag 30. Januar 2012, 16:38

Hallo EyDu

Habe mich zu früh gefreut, zwar konnte ich die Liste in ein TAB-getrenntes Format überführen, aber die Liste lässt sich nicht zum Bearbeiten öffnen.
EyDu hat geschrieben:Dein zeit mal, was in ``op_kunden_access_path`` steht. Ich tippe auf eine Escape-Sequenz.

Warum versuchst due die gezeigte Datei überhaupt mit dem csv-Modul zu öffnen? Die hat mit csv-Dateien nun so gar nichts zu tun.
Der Pfad ist im Code hinterlegt. Habe bisher gute Erfahrungen mit dem csv-Modul gemacht, gerade wenn es um TAB-getrennte Listen geht.

Der Code:

Code: Alles auswählen

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# For Python3.x


import os
import re
import sys
import csv
import codecs


# KUNDEN_ACCESS.txt
op_kunden_access_path = os.path.join(os.path.dirname(__file__),
                        'base_officeplanet', 'KUNDEN_ACCESS.txt'),
# KUNDEN.txt
op_kunden_path = os.path.join(os.path.dirname(__file__),
                        'base_officeplanet', 'KUNDEN.txt'),
# KUNDENKONDITIONEN.txt
op_kundenkonditionen_path = os.path.join(os.path.dirname(__file__),
                        'base_officeplanet', 'KUNDENKONDITIONEN.txt'),


def customer_access():
    data = set()
    kunden = set()
    konditionen = set()
    with codecs.open(op_kunden_access_path, "r") as infile:
        reader = csv.reader(infile, delimiter="\t", quotechar="^")
        for row in reader:
            kundenline = (row[0], row[1], row[2], row[3], row[4], row[5],
                row[6], row[7], row[8], row[9], row[10], row[11], row[12],
                row[13], row[14], row[15], row[17], row[18], row[19],
                row[29], row[30], row[31], row[36], row[42], row[43],
                row[16], '')
            konditionline = (row[0], row[1], row[20], row[21], row[22], 
                row[23], row[24], row[25], row[26], row[27], row[28], '')
            kunden.add(tuple(kundenline))
            konditionen.add(tuple(konditionline))
customer_access()
Ein Datensatz der Liste, sieht nun so aus:
70 70 Fa. OHO Dienstleistungs GmnbH Leergut Herr AHA Leergutankauf Ankererstr. 60 04711 Fledder 0,00 Herr Henning Hübner 0000 000000 0000 00000 Frau Pau 0000 00000 Leergut-Nr. 0000000 immer angeben Abholung, frei Haus ab 0 € Ab 20,- € wird Vergütung gut geschrieben, darunter entfällt eine Gutschrift! Abrechnungen/Gutschriften etc.: Frau Pau Tel. 00000 000000 Fax 0000 000000 pau@pau-box.de 0,00 € 0,00 € 0,00 0,00 € 0,00 0,00 0,00 € 0 Sofort 0 1 Auftraggeber bei Abholung: IPC - Grüne Umweltbox Ankerer. 60 04711 Fledder Alte Firmierung: LOL, Entsorgungs-Zentrum GmbH, Wikinger-Str. 138, 04711 Köln Tel.: 0000 0000000 Fax: 0000 0000000 0 2006 1.1.2006 00:00:00 0000000 0 33,25 € 44,60 € 0
Die Fehlermeldung:

Code: Alles auswählen

Traceback (most recent call last):
  File "kunden_access.py", line 40, in <module>
    customer_access()
  File "kunden_access.py", line 28, in customer_access
    with codecs.open(op_kunden_access_path, "r") as infile:
  File "/usr/lib/python2.7/codecs.py", line 881, in open
    file = __builtin__.open(filename, mode, buffering)
TypeError: coercing to Unicode: need string or buffer, tuple found
Grüße Nobuddy
Zuletzt geändert von Nobuddy am Freitag 30. November 2012, 16:56, insgesamt 1-mal geändert.
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Und du kommst nicht auf die naheliegende Idee zu prüfen welchen Wert op_kunden_access_path hat?
Das Leben ist wie ein Tennisball.
Nobuddy
User
Beiträge: 1023
Registriert: Montag 30. Januar 2012, 16:38

Doch, der Wert ist 'base_officeplanet/KUNDEN_ACCESS.txt'.
Der Ordner 'base_officeplanet' ist im gleichen Hauptordner, wie das Modul.

Nachtrag:
Habe gerade festgestellt, wenn ich den kompletten Pfad angebe, funktioniert es.
Verstehe das jetzt nicht, da ich sonst immer obige Vorgehensweise verwendet habe und dies bisher immer funktionierte.
Kannst Du mir vielleicht da auf die Sprünge helfen?
Zuletzt geändert von Nobuddy am Freitag 30. November 2012, 16:51, insgesamt 1-mal geändert.
lunar

@Nobuddy Nicht zum Problem, sondern zum Datenschutz.

Deine Daten enthalten offensichtlich persönliche Daten, insbesondere Namen und Adressen. Bist Du sicher, dass Du diese Daten einfach so ins Netz stellen darfst? Wenn nicht, dann entferne bitte unverzüglich alle Namen, Adressen und anderweitige persönliche Daten aus Deinen Beiträgen, ich werde dann die Beiträge anderer Nutzer dahingehend bearbeiten.

Auch wenn Du nur um Hilfe fragst, musst Du Dich trotzdem an Datenschutzvorschriften halten.
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Nobuddy hat geschrieben:Doch, der Wert ist 'base_officeplanet/KUNDEN_ACCESS.txt'.
Nein, dein Code erzeugt ein Tupel mit dem einzigen Eintrag 'base_officeplanet/KUNDEN_ACCESS.txt'.

Nichts anderes sagt ja auch die Fehlermeldung:

Code: Alles auswählen

TypeError: coercing to Unicode: need string or buffer, tuple found
Das Leben ist wie ein Tennisball.
Nobuddy
User
Beiträge: 1023
Registriert: Montag 30. Januar 2012, 16:38

Hallo lunar
Danke für den Hinweis, habe soweit alles unkenntlich gemacht. :wink:

Hallo EyDu
Hast ja völlig Recht, auch trotz meiner geringen Englischkenntnis, hätte mir das auffallen sollen. :wink:

Der Fehler lag im Code, ein doofes Komma vom Kopieren. :oops:

Code: Alles auswählen

# KUNDEN_ACCESS.txt
op_kunden_access_path = os.path.join(os.path.dirname(__file__),
                        'base_officeplanet', 'KUNDEN_ACCESS.txt')[u],[/u]
Grüße Nobuddy
Antworten