最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

基于Python和PyQt5實(shí)現(xiàn)文件列表生成器

 更新時(shí)間:2026年02月07日 08:55:36   作者:老歌老聽老掉牙  
這篇文章將深入探討一個(gè)基于Python和PyQt5的完整解決方案,它不僅實(shí)現(xiàn)了功能,更在用戶體驗(yàn)和代碼優(yōu)雅性之間找到了平衡點(diǎn),感興趣的小伙伴可以了解下

在軟件開發(fā)中,文件管理是一個(gè)看似簡(jiǎn)單卻蘊(yùn)含復(fù)雜性的任務(wù)。當(dāng)我們面對(duì)一個(gè)包含數(shù)千個(gè)文件的目錄時(shí),如何高效地遍歷、整理并導(dǎo)出文件列表?這個(gè)問(wèn)題涉及到算法復(fù)雜度O(n)的遍歷、T(n)=Θ(nlogn)的排序,以及用戶界面設(shè)計(jì)的多個(gè)維度。本文將深入探討一個(gè)基于Python和PyQt5的完整解決方案,它不僅實(shí)現(xiàn)了功能,更在用戶體驗(yàn)和代碼優(yōu)雅性之間找到了平衡點(diǎn)。

核心算法分析

文件遍歷的本質(zhì)是樹的深度優(yōu)先搜索(DFS),對(duì)于包含n個(gè)文件的目錄結(jié)構(gòu),時(shí)間復(fù)雜度為O(n)。但真正的挑戰(zhàn)在于如何將遞歸遍歷的結(jié)果以人類可讀的方式呈現(xiàn)。我們的解決方案采用os.walk()函數(shù),該函數(shù)本質(zhì)上實(shí)現(xiàn)了文件系統(tǒng)的DFS遍歷,返回三元組(root,dirs,files),其中每個(gè)元素都代表了遍歷過(guò)程中的關(guān)鍵節(jié)點(diǎn)。

排序算法采用了Python內(nèi)置的sort()方法,基于Timsort算法實(shí)現(xiàn),其時(shí)間復(fù)雜度為T(n)=Θ(nlogn),空間復(fù)雜度為S(n)=O(n)。這種算法特別適合處理部分有序的數(shù)據(jù),而文件列表通常具有一定的局部有序性。

界面渲染采用了PyQt5的事件驅(qū)動(dòng)模型,主線程保持響應(yīng)時(shí)間為R(t)<100ms,確保用戶體驗(yàn)流暢。通過(guò)Qt的信號(hào)槽機(jī)制,我們將文件遍歷這一可能耗時(shí)的操作放在主線程中執(zhí)行,但通過(guò)適當(dāng)?shù)倪M(jìn)度反饋避免了界面凍結(jié)。

import sys
import os
import datetime
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from PyQt5.QtGui import *

class FileListGenerator(QWidget):
    def __init__(self):
        super().__init__()
        self.current_directory = ""
        self.init_ui()
        self.apply_styles()
        
    def init_ui(self):
        self.setWindowTitle('文件列表生成器 - 專業(yè)版')
        self.setWindowIcon(self.style().standardIcon(QStyle.SP_DirIcon))
        self.setGeometry(350, 250, 900, 650)
        
        main_layout = QVBoxLayout()
        main_layout.setSpacing(12)
        main_layout.setContentsMargins(20, 20, 20, 20)
        
        header = QLabel('?? 智能文件列表生成器')
        header.setAlignment(Qt.AlignCenter)
        header_font = QFont()
        header_font.setPointSize(18)
        header_font.setBold(True)
        header.setFont(header_font)
        main_layout.addWidget(header)
        
        description = QLabel('選擇目錄后自動(dòng)掃描所有文件,支持遞歸遍歷和多種導(dǎo)出格式')
        description.setAlignment(Qt.AlignCenter)
        description.setWordWrap(True)
        main_layout.addWidget(description)
        
        self.setup_directory_section(main_layout)
        self.setup_control_panel(main_layout)
        self.setup_file_display(main_layout)
        self.setup_export_section(main_layout)
        self.setup_status_bar(main_layout)
        
        self.setLayout(main_layout)
        
    def apply_styles(self):
        self.setStyleSheet("""
            QWidget {
                background-color: #f5f7fa;
                font-family: 'Segoe UI', 'Microsoft YaHei', sans-serif;
            }
            QLabel {
                color: #2c3e50;
            }
            QPushButton {
                background-color: #3498db;
                color: white;
                border: none;
                padding: 8px 16px;
                border-radius: 4px;
                font-weight: 500;
                min-height: 32px;
            }
            QPushButton:hover {
                background-color: #2980b9;
            }
            QPushButton:pressed {
                background-color: #1c6ea4;
            }
            QPushButton:disabled {
                background-color: #bdc3c7;
            }
            QPushButton#successButton {
                background-color: #27ae60;
            }
            QPushButton#successButton:hover {
                background-color: #219653;
            }
            QLineEdit, QTextEdit {
                border: 1px solid #dce4ec;
                border-radius: 4px;
                padding: 8px;
                background-color: white;
                selection-background-color: #3498db;
            }
            QLineEdit:focus, QTextEdit:focus {
                border: 1px solid #3498db;
                outline: none;
            }
            QGroupBox {
                border: 2px solid #ecf0f1;
                border-radius: 6px;
                margin-top: 10px;
                padding-top: 15px;
                font-weight: bold;
                color: #34495e;
                background-color: white;
            }
            QGroupBox::title {
                subcontrol-origin: margin;
                left: 10px;
                padding: 0 8px 0 8px;
            }
            QProgressBar {
                border: 1px solid #bdc3c7;
                border-radius: 4px;
                text-align: center;
                background-color: #ecf0f1;
            }
            QProgressBar::chunk {
                background-color: #2ecc71;
                border-radius: 4px;
            }
            QStatusBar {
                background-color: #34495e;
                color: #ecf0f1;
            }
            QCheckBox {
                spacing: 8px;
            }
            QCheckBox::indicator {
                width: 18px;
                height: 18px;
            }
        """)
        
    def setup_directory_section(self, parent_layout):
        group = QGroupBox("目錄選擇")
        layout = QVBoxLayout()
        
        path_layout = QHBoxLayout()
        self.path_label = QLabel("尚未選擇目錄")
        self.path_label.setWordWrap(True)
        self.path_label.setMinimumHeight(40)
        self.path_label.setAlignment(Qt.AlignCenter)
        
        browse_btn = QPushButton("選擇目錄")
        browse_btn.setIcon(self.style().standardIcon(QStyle.SP_DirOpenIcon))
        browse_btn.clicked.connect(self.select_directory)
        
        path_layout.addWidget(self.path_label, 4)
        path_layout.addWidget(browse_btn, 1)
        layout.addLayout(path_layout)
        
        group.setLayout(layout)
        parent_layout.addWidget(group)
        
    def setup_control_panel(self, parent_layout):
        group = QGroupBox("掃描選項(xiàng)")
        layout = QHBoxLayout()
        
        self.recursive_check = QCheckBox("遞歸掃描子目錄")
        self.recursive_check.setChecked(True)
        
        self.include_hidden_check = QCheckBox("包含隱藏文件")
        
        self.sort_check = QCheckBox("按名稱排序")
        self.sort_check.setChecked(True)
        
        layout.addWidget(self.recursive_check)
        layout.addWidget(self.include_hidden_check)
        layout.addWidget(self.sort_check)
        layout.addStretch()
        
        self.scan_btn = QPushButton("開始掃描")
        self.scan_btn.setEnabled(False)
        self.scan_btn.clicked.connect(self.scan_files)
        layout.addWidget(self.scan_btn)
        
        group.setLayout(layout)
        parent_layout.addWidget(group)
        
    def setup_file_display(self, parent_layout):
        group = QGroupBox("文件列表預(yù)覽")
        layout = QVBoxLayout()
        
        stats_layout = QHBoxLayout()
        self.file_count_label = QLabel("文件總數(shù): 0")
        self.total_size_label = QLabel("總大小: 0 B")
        
        stats_layout.addWidget(self.file_count_label)
        stats_layout.addStretch()
        stats_layout.addWidget(self.total_size_label)
        layout.addLayout(stats_layout)
        
        self.progress_bar = QProgressBar()
        self.progress_bar.setVisible(False)
        layout.addWidget(self.progress_bar)
        
        self.file_list_display = QTextEdit()
        self.file_list_display.setReadOnly(True)
        self.file_list_display.setMinimumHeight(300)
        font = QFont("Consolas", 10)
        self.file_list_display.setFont(font)
        layout.addWidget(self.file_list_display)
        
        group.setLayout(layout)
        parent_layout.addWidget(group)
        
    def setup_export_section(self, parent_layout):
        group = QGroupBox("導(dǎo)出設(shè)置")
        layout = QVBoxLayout()
        
        filename_layout = QHBoxLayout()
        filename_layout.addWidget(QLabel("文件名:"))
        
        self.filename_input = QLineEdit()
        self.filename_input.setText(f"file_list_{datetime.datetime.now().strftime('%Y%m%d')}.txt")
        filename_layout.addWidget(self.filename_input, 1)
        
        format_layout = QHBoxLayout()
        format_layout.addWidget(QLabel("格式:"))
        
        self.txt_radio = QRadioButton("TXT")
        self.txt_radio.setChecked(True)
        self.csv_radio = QRadioButton("CSV")
        
        format_layout.addWidget(self.txt_radio)
        format_layout.addWidget(self.csv_radio)
        format_layout.addStretch()
        
        layout.addLayout(filename_layout)
        layout.addLayout(format_layout)
        
        self.export_btn = QPushButton("導(dǎo)出文件")
        self.export_btn.setObjectName("successButton")
        self.export_btn.setEnabled(False)
        self.export_btn.clicked.connect(self.export_list)
        layout.addWidget(self.export_btn, 0, Qt.AlignRight)
        
        group.setLayout(layout)
        parent_layout.addWidget(group)
        
    def setup_status_bar(self, parent_layout):
        self.status_bar = QStatusBar()
        self.status_bar.showMessage("就緒")
        parent_layout.addWidget(self.status_bar)
        
    def select_directory(self):
        directory = QFileDialog.getExistingDirectory(
            self,
            "選擇目錄",
            QDir.homePath(),
            QFileDialog.ShowDirsOnly | QFileDialog.DontResolveSymlinks
        )
        
        if directory:
            self.current_directory = directory
            self.path_label.setText(directory)
            self.path_label.setToolTip(directory)
            self.scan_btn.setEnabled(True)
            self.status_bar.showMessage(f"已選擇目錄: {directory}")
            
    def scan_files(self):
        if not self.current_directory:
            return
            
        self.file_list_display.clear()
        self.progress_bar.setVisible(True)
        self.progress_bar.setValue(0)
        QApplication.processEvents()
        
        try:
            all_files = []
            total_size = 0
            
            if self.recursive_check.isChecked():
                walker = os.walk(self.current_directory)
                for root, dirs, files in walker:
                    if not self.include_hidden_check.isChecked():
                        dirs[:] = [d for d in dirs if not d.startswith('.')]
                        files = [f for f in files if not f.startswith('.')]
                    
                    for file in files:
                        full_path = os.path.join(root, file)
                        rel_path = os.path.relpath(full_path, self.current_directory)
                        all_files.append(rel_path)
                        
                        try:
                            total_size += os.path.getsize(full_path)
                        except:
                            pass
            else:
                for item in os.listdir(self.current_directory):
                    full_path = os.path.join(self.current_directory, item)
                    if os.path.isfile(full_path):
                        if not self.include_hidden_check.isChecked() and item.startswith('.'):
                            continue
                        all_files.append(item)
                        
                        try:
                            total_size += os.path.getsize(full_path)
                        except:
                            pass
            
            if self.sort_check.isChecked():
                all_files.sort(key=lambda x: x.lower())
            
            self.progress_bar.setValue(50)
            QApplication.processEvents()
            
            self.display_file_list(all_files, total_size)
            self.progress_bar.setValue(100)
            
            self.export_btn.setEnabled(True)
            self.status_bar.showMessage(f"掃描完成,找到 {len(all_files)} 個(gè)文件")
            
            QTimer.singleShot(1000, lambda: self.progress_bar.setVisible(False))
            
        except Exception as e:
            QMessageBox.critical(self, "掃描錯(cuò)誤", f"掃描過(guò)程中發(fā)生錯(cuò)誤:\n{str(e)}")
            self.status_bar.showMessage("掃描失敗")
            self.progress_bar.setVisible(False)
            
    def display_file_list(self, files, total_size):
        self.file_list_display.clear()
        
        header = f"目錄掃描報(bào)告\n"
        header += f"生成時(shí)間: {datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')}\n"
        header += f"掃描目錄: {self.current_directory}\n"
        header += f"文件數(shù)量: {len(files)}\n"
        header += f"總文件大小: {self.format_size(total_size)}\n"
        header += "=" * 60 + "\n\n"
        
        self.file_list_display.setPlainText(header)
        
        for i, file_path in enumerate(files, 1):
            self.file_list_display.append(f"{i:4d}. {file_path}")
            
            if i % 100 == 0:
                QApplication.processEvents()
        
        self.file_count_label.setText(f"文件總數(shù): {len(files)}")
        self.total_size_label.setText(f"總大小: {self.format_size(total_size)}")
        
    def format_size(self, size_bytes):
        for unit in ['B', 'KB', 'MB', 'GB', 'TB']:
            if size_bytes < 1024.0:
                return f"{size_bytes:.2f} {unit}"
            size_bytes /= 1024.0
        return f"{size_bytes:.2f} PB"
        
    def export_list(self):
        if not self.file_list_display.toPlainText().strip():
            QMessageBox.warning(self, "警告", "沒(méi)有可導(dǎo)出的文件列表")
            return
            
        filename = self.filename_input.text().strip()
        if not filename:
            QMessageBox.warning(self, "警告", "請(qǐng)輸入文件名")
            return
            
        default_ext = ".csv" if self.csv_radio.isChecked() else ".txt"
        if not filename.lower().endswith(('.txt', '.csv')):
            filename += default_ext
            
        save_path, _ = QFileDialog.getSaveFileName(
            self,
            "保存文件",
            os.path.join(QDir.homePath(), filename),
            "文本文件 (*.txt);;CSV文件 (*.csv);;所有文件 (*.*)"
        )
        
        if save_path:
            try:
                content = self.file_list_display.toPlainText()
                
                if self.csv_radio.isChecked() and save_path.endswith('.csv'):
                    lines = content.split('\n')
                    csv_content = "序號(hào),文件路徑\n"
                    for i, line in enumerate(lines[8:], 1):
                        if line.strip() and not line.startswith('='):
                            if '. ' in line:
                                csv_content += f"{i},{line.split('. ', 1)[1]}\n"
                else:
                    csv_content = content
                
                with open(save_path, 'w', encoding='utf-8') as f:
                    f.write(csv_content)
                    
                QMessageBox.information(
                    self,
                    "導(dǎo)出成功",
                    f"文件已成功導(dǎo)出到:\n{save_path}\n\n"
                    f"文件大小: {os.path.getsize(save_path):,} 字節(jié)"
                )
                
                self.status_bar.showMessage(f"文件已導(dǎo)出: {os.path.basename(save_path)}")
                
            except Exception as e:
                QMessageBox.critical(self, "導(dǎo)出失敗", f"導(dǎo)出文件時(shí)出錯(cuò):\n{str(e)}")
                self.status_bar.showMessage("導(dǎo)出失敗")

def main():
    app = QApplication(sys.argv)
    
    app.setApplicationName("文件列表生成器")
    app.setApplicationDisplayName("文件列表生成器專業(yè)版")
    
    if hasattr(Qt, 'AA_EnableHighDpiScaling'):
        app.setAttribute(Qt.AA_EnableHighDpiScaling, True)
    if hasattr(Qt, 'AA_UseHighDpiPixmaps'):
        app.setAttribute(Qt.AA_UseHighDpiPixmaps, True)
    
    window = FileListGenerator()
    window.show()
    
    sys.exit(app.exec_())

if __name__ == '__main__':
    main()

架構(gòu)設(shè)計(jì)哲學(xué)

這個(gè)文件列表生成器的設(shè)計(jì)體現(xiàn)了多層架構(gòu)思想。在表示層,PyQt5提供了豐富的控件和布局管理器;在業(yè)務(wù)邏輯層,Python的os模塊處理文件系統(tǒng)操作;在數(shù)據(jù)持久化層,簡(jiǎn)單的文件I/O操作完成導(dǎo)出功能。這三層之間的耦合度被精心控制在合理范圍內(nèi),使得每個(gè)模塊都可以獨(dú)立修改和測(cè)試。

算法性能方面,遞歸遍歷的時(shí)間復(fù)雜度為O(n),其中n是文件和目錄的總數(shù)。排序操作的時(shí)間復(fù)雜度為T(n)=Θ(nlogn),這是比較排序的理論下限。內(nèi)存使用方面,程序需要存儲(chǔ)所有文件路徑,空間復(fù)雜度為S(n)=O(n)。對(duì)于包含數(shù)百萬(wàn)文件的極端情況,可以采用流式處理或分批處理策略,但當(dāng)前實(shí)現(xiàn)已經(jīng)能夠處理絕大多數(shù)實(shí)際場(chǎng)景。

用戶界面響應(yīng)性通過(guò)事件循環(huán)和適當(dāng)?shù)倪M(jìn)度反饋來(lái)保證。掃描過(guò)程中,主事件循環(huán)定期處理QApplication.processEvents(),防止界面凍結(jié)。這種設(shè)計(jì)確保了即使在掃描大型目錄時(shí),用戶仍然可以取消操作或與界面其他部分交互。

擴(kuò)展可能性

這個(gè)基礎(chǔ)框架可以輕松擴(kuò)展為更復(fù)雜的文件管理工具。例如,可以添加文件過(guò)濾功能,支持基于正則表達(dá)式或通配符的模式匹配;可以集成文件屬性顯示,如修改時(shí)間、文件權(quán)限等;可以添加批量重命名功能;甚至可以與云存儲(chǔ)API集成,直接掃描云端目錄。

在算法優(yōu)化方面,可以考慮使用多線程或異步IO來(lái)進(jìn)一步提高掃描速度。對(duì)于特別大的目錄,可以實(shí)現(xiàn)增量掃描和緩存機(jī)制,避免重復(fù)掃描未變化的目錄部分。

結(jié)語(yǔ)

這個(gè)文件列表生成器雖然功能簡(jiǎn)單,但體現(xiàn)了現(xiàn)代軟件開發(fā)中的多個(gè)重要原則:關(guān)注點(diǎn)分離、算法效率、用戶體驗(yàn)和代碼可維護(hù)性。它不僅是實(shí)用的工具,也是學(xué)習(xí)PyQt5和Python文件系統(tǒng)操作的優(yōu)秀示例。通過(guò)深入理解這個(gè)程序的每一行代碼,開發(fā)者可以掌握GUI編程、文件系統(tǒng)交互和算法設(shè)計(jì)的核心技能,為更復(fù)雜的軟件開發(fā)項(xiàng)目打下堅(jiān)實(shí)基礎(chǔ)。

文件管理作為計(jì)算機(jī)科學(xué)的基礎(chǔ)問(wèn)題,其解決方案的演變反映了整個(gè)領(lǐng)域的發(fā)展歷程。從早期的命令行工具到現(xiàn)代的圖形界面應(yīng)用,不變的是對(duì)效率、可靠性和用戶體驗(yàn)的追求。這個(gè)程序正是這一追求的當(dāng)代體現(xiàn),它將復(fù)雜的算法封裝在簡(jiǎn)潔的界面之后,讓技術(shù)真正服務(wù)于用戶需求。

到此這篇關(guān)于基于Python和PyQt5實(shí)現(xiàn)文件列表生成器的文章就介紹到這了,更多相關(guān)Python文件列表生成器內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Django使用HttpResponse返回圖片并顯示的方法

    Django使用HttpResponse返回圖片并顯示的方法

    今天小編就為大家分享一篇Django使用HttpResponse返回圖片并顯示的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-05-05
  • opencv python簡(jiǎn)易文檔之圖像處理算法

    opencv python簡(jiǎn)易文檔之圖像處理算法

    OpenCV是一個(gè)開源庫(kù),包含了許多計(jì)算機(jī)視覺(jué)算法,它在計(jì)算機(jī)視覺(jué)和圖像處理中起著重要作用,用于實(shí)時(shí)操作,其效率足以滿足工業(yè)上的要求,這篇文章主要給大家介紹了關(guān)于opencv python簡(jiǎn)易文檔之圖像處理算法的相關(guān)資料,需要的朋友可以參考下
    2021-08-08
  • Python讀取、寫入txt文本內(nèi)容詳解

    Python讀取、寫入txt文本內(nèi)容詳解

    這篇文章主要介紹了Python讀取、寫入txt文本內(nèi)容詳解,python常用的讀取文件函數(shù)有三種read()、readline()、readlines() ,今天來(lái)看一下三種函數(shù)的用法與三者的區(qū)別,需要的朋友可以參考下
    2023-08-08
  • python3操作mysql數(shù)據(jù)庫(kù)的方法

    python3操作mysql數(shù)據(jù)庫(kù)的方法

    這篇文章主要介紹了python3操作mysql數(shù)據(jù)庫(kù)的方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-06-06
  • python的命名規(guī)則知識(shí)點(diǎn)總結(jié)

    python的命名規(guī)則知識(shí)點(diǎn)總結(jié)

    在本篇文章里小編給大家分享的是關(guān)于python的命名規(guī)則知識(shí)點(diǎn)總結(jié),有需要的朋友們可以參考下。
    2019-10-10
  • 一文深入探討Python中的異常捕獲機(jī)制

    一文深入探討Python中的異常捕獲機(jī)制

    在Python編程中,異常處理是構(gòu)建健壯程序的關(guān)鍵部分,就像開車需要安全帶一樣,編寫代碼也需要異常處理機(jī)制來(lái)應(yīng)對(duì)可能出現(xiàn)的錯(cuò)誤情況,本文將深入探討Python中的異常捕獲機(jī)制,需要的朋友可以參考下
    2026-01-01
  • python3中str(字符串)的使用教程

    python3中str(字符串)的使用教程

    這篇文章主要介紹了python3中str(字符串)的使用教程,文中介紹的非常詳細(xì),對(duì)python3中各種str字符串的操作都包含這篇文章中了,需要的朋友可以參考學(xué)習(xí),下面來(lái)一起看看吧。
    2017-03-03
  • 純numpy數(shù)值微分法實(shí)現(xiàn)手寫數(shù)字識(shí)別

    純numpy數(shù)值微分法實(shí)現(xiàn)手寫數(shù)字識(shí)別

    本文主要介紹了純numpy數(shù)值微分法實(shí)現(xiàn)手寫數(shù)字識(shí)別,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-08-08
  • python 內(nèi)置模塊詳解

    python 內(nèi)置模塊詳解

    模塊是一個(gè)保存了Python代碼的文件。模塊能定義函數(shù),類和變量。模塊里也能包含可執(zhí)行的代碼,今天我們就來(lái)詳細(xì)探討下python內(nèi)置的一些常用模塊
    2019-01-01
  • Python實(shí)現(xiàn)將json文件中向量寫入Excel的方法

    Python實(shí)現(xiàn)將json文件中向量寫入Excel的方法

    這篇文章主要介紹了Python實(shí)現(xiàn)將json文件中向量寫入Excel的方法,涉及Python讀取、遍歷json格式數(shù)據(jù)及Excel文件寫入相關(guān)操作技巧,需要的朋友可以參考下
    2018-03-03

最新評(píng)論

陈巴尔虎旗| 肥东县| 正镶白旗| 闻喜县| 剑川县| 大化| 天峨县| 东明县| 花莲县| 广州市| 潼南县| 曲麻莱县| 宜川县| 依安县| 梅州市| 石嘴山市| 蕉岭县| 潮州市| 和静县| 佳木斯市| 增城市| 平度市| 农安县| 阿荣旗| 南投县| 托克托县| 香河县| 和静县| 瓮安县| 天门市| 渝中区| 安塞县| 察隅县| 隆子县| 宾川县| 马鞍山市| 临夏县| 汉沽区| 贵德县| 泰来县| 孝感市|