IOError 22 в python Недействительно в Windows

Я создаю сниффер для последовательного порта в Python, но у меня проблема, когда я создаю CSV-файл в Windows. В какой-то момент я разделил свою программу, чтобы избежать возможности несовместимости между Windows и Linux. Он отлично работает в Linux (тест на 32 и 64 байта).

def createNewFiles(self):
    # Nons allons vérifier l'existance du dossier Sniffer_Serie_Result et le créer si besoin
    # De même pour le fichier csv
    if (os.name == "nt"): # pour windows
        self.userPath = os.getenv('HOME') or os.getenv('USERPROFILE')
        self.folderPath= os.path.abspath(self.userPath + "\\Sniffer_Serie_Result")
        #exist_ok=True ==> cree le dossier si il n'existe pas
        os.makedirs(self.folderPath,exist_ok=True)
        self.timestampWithSec= self.timestampWithoutMilli() # utilisé dans les noms de fichier
        self.filePathRequest= os.path.abspath(self.folderPath + "\\Request_at_" + self.timestampWithSec + ".csv")
        self.filePathResponse= os.path.abspath(self.folderPath + "\\Response_at_" + self.timestampWithSec + ".csv")
        self.filePathOverall = os.path.abspath(self.folderPath + "\\Overall_result_at_" + self.timestampWithSec + ".csv")
        with open(self.filePathRequest, 'w') as f:
            writer = csv.writer(f)
            writer.writerow(["Kind of message","Timestamp","Message Hexa","Message ASCII"]) 
        with open(self.filePathResponse, 'w') as f:
            writer = csv.writer(f)
            writer.writerow(["Kind of message","Timestamp","Message Hexa","Message ASCII"])

Папка Sniffer_Serie_Result создается без ошибок. Поэтому этот код сначала возвращает следующую ошибку:

IOError: [Errno 22] Недопустимый аргумент: 'C:\Documents and Settings\stagiaire\Sniffer_Serie_Result\Request_at_......(фактическая дата и часы).csv'

Я пробую много строк, таких как необработанные строки, и ничего не работает.

NB: Windows, которую я использую для своего теста, - это XP, это должно работать и на 7.

Я надеюсь, что вы можете мне помочь. Спасибо за вашу помощь!

Я не могу дать больше информации до четверга (на данный момент дома нет интернета)


person Wodric    schedule 14.08.2012    source источник
comment
Прежде всего, используйте os.path.join() для объединения каталогов, а не добавляйте косые черты вручную. Во-вторых, что содержит timestampWithSec?   -  person Michał Górny    schedule 14.08.2012
comment
Привет, я попробую это, timstamp содержит время в ул.   -  person Wodric    schedule 16.08.2012
comment
Итак, я пробую ваше решение, но ошибка точно такая же   -  person Wodric    schedule 16.08.2012
comment
Я имел в виду: пожалуйста, вставьте пример содержимого timestampWithSec. Я подозреваю, что он просто содержит некоторые символы, которые недопустимы для Windows.   -  person Michał Górny    schedule 16.08.2012
comment
Пример имени файла в Linux (имя одинаковое в обеих системах): Request_at_2012-08-14_14:41:30.csv, поэтому временная метка точно содержит: 2012-08-14_14:41:30   -  person Wodric    schedule 16.08.2012


Ответы (3)


Вы пытаетесь использовать символы : в имени файла, тогда как этот символ зарезервирован в Windows для имен дисков (например, c:/).

Вы должны либо:

  1. Измените timestampWithoutMilli(), чтобы использовать другой разделитель времени (например, -),
  2. Замените все : в полученной строке времени другим символом (используя, например, .replace()).
person Michał Górny    schedule 16.08.2012
comment
Только за это!!! 2 дня на эту ошибку. Тестирую. Я не могу проголосовать, извините... ваш ответ может помочь другим людям - person Wodric; 16.08.2012
comment
Честно говоря, я думаю, что это довольно распространенная ошибка. Я почти уверен, что уже видел это здесь. - person Michał Górny; 16.08.2012
comment
Да, может быть, я ищу на французских и английских форумах, и вы первый, кто может мне помочь ... - person Wodric; 16.08.2012
comment
Чтобы избежать этого позже, убедитесь, что вы используете try/except, чтобы позволить операционной системе сортировать допустимые имена файлов или нет. - person Burhan Khalid; 16.08.2012
comment
Исключение более точное, чем классическая трассировка? - person Wodric; 16.08.2012

Возможно, вы получаете неэкранированный \ в userPath. Попробуйте заменить все \ на /.

person f p    schedule 14.08.2012
comment
Я добавляю некоторую точность, В новом коме с кодом. Если я использую os.path.abspath(), путь будет таким же, как и раньше, поэтому я попробую без этого. - person Wodric; 16.08.2012

def createNewFiles(self):
        # Nons allons vérifier l'existance du dossier Sniffer_Serie_Result et le créer si besoin
        # De même pour le fichier csv
        if (os.name == "nt"): # pour windows
            self.userPath = os.getenv('HOME') or os.getenv('USERPROFILE')
            self.folderPath= self.userPath + "/Sniffer_Serie_Result"
            #exist_ok=True ==> cree le dossier si il n'existe pas
            os.makedirs(self.folderPath,exist_ok=True)
            self.timestampWithSec= self.timestampWithoutMilli() # utilisé dans les noms de fichier
            self.filePathRequest= self.folderPath + "/Request_at_" + self.timestampWithSec + ".csv"
            self.filePathResponse= self.folderPath + "/Response_at_" + self.timestampWithSec + ".csv"
            self.filePathOverall = self.folderPath + "/Overall_result_at_" + self.timestampWithSec + ".csv"
            with open(self.filePathRequest, 'w') as f:
                writer = csv.writer(f)
                writer.writerow(["Kind of message","Timestamp","Message Hexa","Message ASCII"]) 
            with open(self.filePathResponse, 'w') as f:
                writer = csv.writer(f)
                writer.writerow(["Kind of message","Timestamp","Message Hexa","Message ASCII"])

С этим кодом проблема точно такая же, создается папка, а не файлы. С той же ошибкой.

person Wodric    schedule 16.08.2012