【问题标题】:python code doesn't generate the csv file [closed]python代码不生成csv文件[关闭]
【发布时间】:2017-12-27 04:58:49
【问题描述】:

目标:我想记录各种硬盘上的所有文件,并收集:文件名、文件夹和文件大小(以兆字节为单位)。代码运行,据我所知不会产生任何错误,但最后不会产生 csv 文件?

我尝试过的: 我尝试使用 Sudo 运行该文件,使用 chmod +x 更改权限,检查 python 对于标准用户和 sudo 用户是否在同一个位置,最后删除或注释掉似乎会产生不同结果或错误的麻烦行取决于操作系统。

import os
from os import path
import sys
import datetime
from datetime import date, time, timedelta
import time
import csv
#from socket import gethostbyname

#variables
#hostname = str(socket.gethostname())
scandir = "/"
savefiledir = "/Users/joshua/Documents/python/"
textfilename = str(datetime.datetime.now().strftime("%Y-%m-%d")) + "_" "directory_printer.csv"

#change directory to the root directory or the one which you want to scan for files (scandir)
os.getcwd()
os.chdir(scandir)
directory = os.getcwd()

#find all files in a directory and it's sub directory regardless of extension
results = [val for sublist in [[os.path.join(i[0], j) for j in i[2]] for i in os.walk(directory)] for val in sublist]

d = {}
file_count = 0
metadata = []

for file in results:
    #full path
    try:
        fullpath = file
    except:
        fullpath = None

    #file name
    try:
        file_directory = "/".join(str(file).split('/')[1:-1])
    except:
        file_directory = None

    #file extension
    try:
        file_ext = str(file).split('/')[-1]
    except:
        file_ext = None

    #subfolders
    try:
        parts = file_directory.split('/')
        sub_folders = ":".join(parts[1:-1])
    except:
        sub_folders = None

    #num subfolders
    try:
        count_subfolders = len(sub_folders.split(':'))
    except:
        count_subfolders = None

    #filesize megabytes
    try:
        filesize_mb = os.path.getsize(file)/1024
    except:
        filesize_mb = None

    #date modified
    try:
        date_modified = datetime.datetime.now() - datetime.datetime.fromtimestamp(path.getmtime(file))
    except:
        date_modified = None

    #time modified
    #try:
#        time_modified = os.stat(fullpath).st_mtime #time of most recent content modification
    #except:
#        time_modified = None


    #time created (windows)
#    try:
#        time_created = os.stat(fullpath).st_ctime #platform dependent; time of most recent metadata change on Unix, or the time of creation on Windows)#    except:
#        time_created = None

    #record all file metadata
    d[file_count] = {'Full_Path': fullpath, 'File_Directory': file_directory,
                     'File_Extension': file_ext, 'List_Sub_Folders' : sub_folders,
                    'Count_Sub_Folders' : count_subfolders, 'Filesize_mb' : filesize_mb,
                     'Date_Modified' : date_modified}

    file_count = file_count + 1

#write the dictinary with the disks file metadata to a csv file
with open(textfilename,'w') as f:
    w = csv.writer(f)
    w.writerows(d.items())

print("Scanning directory: "
      + str(scandir) + " complete!" + "\n"
      + "The results have been saved to: " + "\n"
      + str(savefiledir)+str(textfilename))

【问题讨论】:

  • 可能不是问题,但请检查 results 是否为空,例如在 for 循环之前插入 print(len(results))。更一般地说,插入一些调试代码以查看发生了什么,如果您还没有这样做的话。
  • 从故障排除的角度来看,您可以将任何内容写入磁盘吗?意思是,如果您只是简单地运行以下内容: with open(textfilename, 'w') as f: w = csv.writer(f) w.write('some random text') 这三行是否写入磁盘?如果不是,那么问题是写入磁盘如果是,那么问题是你的代码 >>> 可能 d.items() 是空的,等等。
  • @E.Ducateme 用户 AT jdehesa 的代码解决了这个问题,我正在将最终的 csv 写入不同的目录。

标签: python csv standard-library


【解决方案1】:

实际上,您的代码似乎会将 CSV 文件写入scandir (/),而不是savefiledir,因为在程序开始时您调用了os.chdir(scandir)。如果您想将文件放在正确的位置(最终打印的消息显示它已保存到的位置),您应该这样做:

# ...
#write the dictinary with the disks file metadata to a csv file
with open(savefiledir + textfilename,'w') as f:
    w = csv.writer(f)
    w.writerows(d.items())
# ...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-02-25
    • 2016-09-29
    • 1970-01-01
    • 1970-01-01
    • 2018-05-15
    • 2018-02-01
    • 2011-03-24
    • 1970-01-01
    相关资源
    最近更新 更多