2 votos

Python 2.7 no puede abrir el CSV que acabo de crear....la solución de problemas de otros mensajes no funcionó

Estoy usando python 2.7 en plataforma windows. (No tengo opción de actualizar - no puedo importar ningún módulo no estándar...limitaciones de trabajo). He escrito un archivo csv de una clase de características. A continuación, estoy tratando de volver a formatear el texto en una columna. Por alguna razón no puedo abrir el csv.

Obtengo los siguientes errores:

D:\JJ_Development\Projects\Basemap\Transportation>new.py
D:\JJ_Development\Projects\Basemap\Transportation
Traceback (most recent call last):
  File "D:\JJ_Development\Projects\Basemap\Transportation\new.py", line 199, in <module>
    newlabel()
  File "D:\JJ_Development\Projects\Basemap\Transportation\new.py", line 97, in newlabel
    with open(rc_existing, 'rb') as csvfile:
IOError: [Errno 2] No such file or directory: 'D:\\JJ_Development\\Projects\\Basemap\\Transportation\\roadcore'
  • Tanto el csv como el python script están en mi directorio de trabajo actual.
  • El csv no es de sólo lectura.
  • Puedo abrir el csv tanto en notepad++ como en arcmap sin problemas.
  • El archivo no está bloqueado... He reiniciado el ordenador y he cambiado el nombre además de copiar un nuevo script.

Estoy publicando un fragmento de las creaciones csv (funciona) y luego los errores en la línea "con la apertura" (obviamente esto no es el código completo)

    #********DATA AND PATHS********
curr_dir = os.getcwd()
print(curr_dir)
arcpy.env.workspace = (curr_dir)

#mxd = arcpy.mapping.MapDocument(r'D:\JJ_Development\Projects\Basemap\Transportation\Labels.mxd')
#in_fc = arcpy.mapping.ListLayers(mxd, 'RoadCore_test2')[0]
fc = (r'D:\JJ_Development\Projects\Basemap\Transportation\Roads.gdb\RoadCore_Existing')

fields = ["ID", "ADMIN_ORG", "RTE_CN", "GIS_MILES"]
identical = ["ID", "ADMIN_ORG", "RTE_CN"]
labels = []

rd_names = (' ROAD', ' STREET', ' DRIVE', ' BLUFF', ' COVE',' LOOP', ' LANE', ' RD', ' LN', ' DR')

#********Initial FS Roadcore Existing Data Cleanup********
rc_existing = os.path.join(curr_dir, 'roadcore')

def test():
    fields = ["ID", "ADMIN_ORG", "RTE_CN", "GIS_MILES"]

    with open('{}.csv'.format(rc_existing), 'wb') as outf:
        dw = csv.DictWriter(outf, fieldnames=fields)
        dw.writeheader()
        with arcpy.da.SearchCursor(fc, fields) as rows:
            for row in rows:
                if row[3] == 0:
                    pass
                elif row[3] == None:
                    pass
                else:
                    dw.writerow(dict(zip(fields, row)))
    print "File written: {}".format(rc_existing)
    outf.close()

#********FORMATTING LABELS********
def newlabel():
    with open(rc_existing, 'rb') as csvfile:
        reader = csv.reader(csvfile, delimiter=',', quotechar='|')
        for row in reader:
            print('csv open')

    # with arcpy.da.SearchCursor(rc_existing, fields) as sc:
        # for row in sc:
            # if (row[0].startswith(' ')):
                # labels.append('{}'.format(row[0].replace(' ', '')))

if __name__ == '__main__':
    test()
    newlabel()

1voto

Juraj Misur Puntos 118

Resuelto - ¡¡¡PHEW!!! Estaba tratando de hacer ediciones automatizadas 'en línea' con mi archivo csv abierto. Evidentemente eso no es posible. Para que este script funcione necesitaba crear un archivo temporal para la edición y utilizar shutil.move para hacer escribir el archivo temporal a permanente.

Lecciones aprendidas:

  • Es posible que aparezca un espacio en blanco entre cada línea (yo lo hice) si no se utiliza el modo binario. Gracias elrobis por la respuesta pero ese no era el problema.
  • Puede obtener una coma entre cada carácter de salida si utiliza el plural 'writerows' en lugar de 'writerow'.

Publicar fragmento de código relevante operable aquí si alguien quiere referencia.

#********DATA AND PATHS********
curr_dir = os.getcwd()
print(curr_dir)
arcpy.env.workspace = (curr_dir)

fc = (r'D:\JJ_Development\Projects\Basemap\Transportation\Roads.gdb\RoadCore_Existing')

rc_existing = os.path.join(curr_dir, 'roadcore')
roadcore = r'D:\JJ_Development\Projects\Basemap\Transportation\roadcore.csv'

fields = ["ID", "ADMIN_ORG", "RTE_CN", "GIS_MILES"]
identical = ["ID", "ADMIN_ORG", "RTE_CN"]
labels = []

rd_names = (' ROAD', ' STREET', ' DRIVE', ' BLUFF', ' COVE',' LOOP', ' LANE', ' RD', ' LN', ' DR')

#********Initial FS Roadcore Existing Data Cleanup********

def test():
    fields = ["ID", "ADMIN_ORG", "RTE_CN", "GIS_MILES"]
    with open('{}.csv'.format(rc_existing), 'wb') as outf:
        dw = csv.DictWriter(outf, fieldnames=fields)
        dw.writeheader()
        with arcpy.da.SearchCursor(fc, fields) as rows:
            for row in rows:
                if row[3] == 0:
                    pass
                elif row[3] == None:
                    pass
                else:
                    arcpy.DeleteIdentical_management(fc, identical)
                    dw.writerow(dict(zip(fields, row)))
    print "File written: {}".format(rc_existing)
    outf.close()

#********CREATE TEMP FILE FOR LABEL FORMATTING********
filename = roadcore
rc_temp = NamedTemporaryFile('w+b', delete=False)#default should be binary. Adding binary causes an os.unlink error. 

def temp_file():
    with open(filename, 'r') as csvFile, rc_temp:
        reader = csv.reader(csvFile, delimiter=',', quotechar='|')
        writer = csv.writer(rc_temp, delimiter=',', quotechar='|')
        for row in reader:
            if row[1] == None:
                pass
            elif row[0].startswith(' '):
                labels.append('{}'.format(
                                        row[0]
                                        .replace(' ', '')))
            elif row[1].startswith('01'):
                labels.append('{}'.format(
                                        row[0]
                                        .lstrip(ascii_letters)
                                        .replace(' ', '')
                                        .replace('.', '-')
                                        .lstrip('0')))
            elif row[1].startswith('02'):
                labels.append('{}'.format(
                                        row[0].lstrip(ascii_letters)
                                        .replace(' ', '')
                                        .replace('.', '-')
                                        .lstrip('0')))
            elif row[1].startswith('03'):
                labels.append('{}'.format(
                                        row[0]
                                        .lstrip(ascii_letters)
                                        .replace(' ', '')
                                        .replace('.', '-')
                                        .lstrip('0')))
            elif row[1].startswith('04'):
                labels.append('{}'.format(
                                        row[0]
                                        .lstrip(ascii_letters)
                                        .replace('-ADMIN', '')
                                        .replace('-A-ADMIN','')
                                        .replace('-PARKING','')[2:]
                                        .lstrip('0')
                                        .replace('.', '-')))
            elif row[1].startswith('05'):
                labels.append('{}'.format(
                                        row[0].rstrip('0')
                                        .lstrip('0')
                                        .lstrip(ascii_letters)
                                        .replace('.', '-')))
            elif row [1].startswith('0501'):
#Note: 0501 forest label data entered in unicode.
                labels.append('{}'.format(
                                        row[0].rstrip('0').split('.',1)
                                        .replace(' ', '')))
            elif row[1].startswith('06'):
                labels.append('{}'.format(
                                        row[0].rstrip('0')
                                        .replace('.', '-')
                                        .lstrip(ascii_letters)))
            elif (row[1].startswith('06')) and (row[0].endswith(rd_names)):#if id field contains rd names ASCII strip all alpha
                labels.append('{}'.format(
                                        row[0].rstrip(ascii_letters)))
            elif row[1].startswith('0816'):
                pass
            elif row[1].startswith('08'):
                labels.append('{}'.format(
                                        row[0].lstrip(ascii_letters)))
#Note: R08 label data entered in unicode.
            elif row[1].startswith('09'):
#Note: R09 label data entered in unicode.
                labels.append('{}'.format(
                                        row[0].lstrip('0')
                                        .replace('.', '-')
                                        .lstrip(ascii_letters)))
            elif row[1].startswith('10'):
                labels.append('{}'.format(
                                        row[0]
                                        .lstrip('0')
                                        .replace('.', '-')
                                        .lstrip(ascii_letters)))
            else:
                labels.append(row[0])
            writer.writerow(row)
    #print(labels)
    shutil.move(rc_temp.name, filename)
    print('Label formatting done')

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X