Регистратор Python выдает IOError: [Errno 22] Неверный аргумент

Я получаю сообщение об ошибке при попытке записи в файл и регистрации обычного текста. Вот мой вывод регистратора:

Bad measurement: 40.74478609626E-9,81.48235294118E-9,163.01491596639E-9,244.51470588235E-9,326.05084670232E-9,407.55387700535E-9,489.09705882353E-9,570.63334914611E-9,652.15799632353E-9,733.68823529412E-9,815.19491596639E-9,1.30423299632E-6,2.60858733660E-6,6.11542963458E-6,13.04562372549E-6,26.09313266488E-6,39.13227058824E-6,52.17394175579E-6,78.25093569519E-6,163.01165588235E-6,305.64046063025E-6,611.30138063025E-6,815.07555294118E-6,1.01882401751E-3,1.22261084479E-3,2.44530079118E-3,9.9100E+037

Traceback (most recent call last):
  File "C:\Program Files\JetBrains\PyCharm Community Edition 2017.3.5\helpers\pydev\pydev_run_in_console.py", line 53, in run_file
    pydev_imports.execfile(file, globals, locals)  # execute the script
  File "C:/Projects/main.py", line 209, in <module>
    path = "data.txt"
  File "C:/Projects/main.py", line 177, in run_period
    logger.info("Error: {}".format(repr(e)))
IOError: [Errno 22] Invalid argument

Контекст: я читаю измерения с осциллографа и сохраняю в файл. Иногда данные из области будут повреждены, поэтому я завернул запись в try-catch:

try:
    f.write(",".join(acq) + "\n")
    cnt += 1
except Exception as e:
    logger.info("Bad measurement: {}".format(",".join(acq)))
    logger.info("Error: {}".format(repr(e)))
    logger.info("The measurement couldn't be written to the file")

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

Регистратор назначен на

logging.basicConfig(format='%(message)s', level=logging.INFO)
logger = logging.getLogger("runScript")

Я подумал, что это может быть как-то связано с ограничением буфера ОС Windows , но мой файл всего несколько сотен килобайт.

Функция, выдающая ошибку, является частью PyCharm. Вот функция:

def run_file(file, globals=None, locals=None, is_module=False):
    module_name = None
    entry_point_fn = None
    if is_module:
        file, _,  entry_point_fn = file.partition(':')
        module_name = file
        filename = get_fullname(file)
        if filename is None:
            sys.stderr.write("No module named %s\n" % file)
            return
        else:
            file = filename

    if os.path.isdir(file):
        new_target = os.path.join(file, '__main__.py')
        if os.path.isfile(new_target):
            file = new_target

    if globals is None:
        m = save_main_module(file, 'pydev_run_in_console')

        globals = m.__dict__
        try:
            globals['__builtins__'] = __builtins__
        except NameError:
            pass  # Not there on Jython...

    if locals is None:
        locals = globals

    if not is_module:
        sys.path.insert(0, os.path.split(file)[0])

    print('Running %s' % file)
    try:
        if not is_module:
            pydev_imports.execfile(file, globals, locals)  # execute the script
        else:
            # treat ':' as a seperator between module and entry point function
            # if there is no entry point we run we same as with -m switch. Otherwise we perform
            # an import and execute the entry point
            if entry_point_fn:
                mod = __import__(module_name, level=0, fromlist=[entry_point_fn], globals=globals, locals=locals)
                func = getattr(mod, entry_point_fn)
                func()
            else:
                # Run with the -m switch
                import runpy
                if hasattr(runpy, '_run_module_as_main'):
                    runpy._run_module_as_main(module_name)
                else:
                    runpy.run_module(module_name)
    except:
        traceback.print_exc()

    return globals

person Ellburrito    schedule 20.07.2018    source источник
comment
Пожалуйста, покажите полную трассировку.   -  person roganjosh    schedule 20.07.2018
comment
Здравствуйте, не могли бы вы показать, что назначено на регистратор?   -  person devsaw    schedule 20.07.2018
comment
@roganjosh Остальное - это просто файл и функция, в которой он находится.   -  person Ellburrito    schedule 20.07.2018
comment
Иногда IOError на write возникает из-за реальной ошибки ввода-вывода (ваш диск выходит из строя, вы записываете в сетевую папку, которая была прервана и т. д.), но чаще это просто что-то вроде того, что вы случайно открыли файл в неправильном режиме, или закрыл его, или сделал seek в недопустимую позицию.   -  person abarnert    schedule 20.07.2018
comment
Можете ли вы переместить ",".join(acq из блока try, если это исключение для чтения данных?   -  person Florian Weimer    schedule 20.07.2018
comment
В любом случае, из того, что вы здесь написали, похоже, что IOError происходит из logger.info, и есть какое-то другое исключение из f.write, которое мы не можем увидеть, потому что вы просто выполняете голое except: и отбрасываете эту информацию. Можете ли вы показать нам трассировку, которую вы получаете без этого, или, по крайней мере, изменить ее на except Exception as e: и напечатать (repr (e))` или что-то в этом роде?   -  person abarnert    schedule 20.07.2018
comment
@abarnert Хорошо, пробую и перезапускаю сейчас. Ошибка возникает примерно через час после измерения...   -  person Ellburrito    schedule 20.07.2018
comment
@Ellburrito Поскольку на воспроизведение уходит час, постарайтесь получить все за один цикл. В частности, если вы по-прежнему получаете исключение из logger.info, скопируйте на этот раз всю трассировку, а не просто дайте нам одну строку. (Кроме того, если это Python 3, вам не нужно менять какой-либо код, чтобы получить все это — трассировка для logger.info должна иметь длинный раздел, сообщающий, что это исключение возникло при обработке другого исключения, и включать трассировку для f.write внутри него.)   -  person abarnert    schedule 20.07.2018
comment
@Ellburrito Удалите оператор try/except и опубликуйте здесь все исключение, которое вы получите. Вы получите полную трассировку, и отладить ошибку будет намного проще.   -  person Elis Byberi    schedule 20.07.2018
comment
Каково содержание и тип переменной acq?   -  person Samuel    schedule 20.07.2018
comment
@Samuel acq содержит список поплавков; они показаны в первой строке.   -  person Ellburrito    schedule 20.07.2018
comment
pydev_imports.execfile(file, globals, locals) — это метод, вызывающий исключение. Пожалуйста, вставьте эту строку и код исполняемого файла Python   -  person Samuel    schedule 21.07.2018
comment
Я подозреваю, что проблема может быть как-то связана с консолью PyDev, которой недостаточно реального stderr для logging, чтобы использовать ее как stderr. Но странно, что первое добавленное вами сообщение журнала печатается нормально. В repr(e) должно быть что-то другое. Может быть, не-ASCII-символ? Вы ожидаете, что это поднимет UnicodeEncodeError, но, может быть, PyCharm пытается что-то сделать, чтобы справиться с этим, и терпит неудачу? Если бы вы могли войти str(repr(e).encode('unicode-escape'))? Или вы можете просто попробовать print(repr(e)) вместо регистрации?   -  person abarnert    schedule 21.07.2018
comment
Или, что проще всего, просто удалите except и дайте ему распечатать трассировку.   -  person abarnert    schedule 21.07.2018