Python 重新排列CSV列

Python 重新排列CSV列,python,python-3.x,csv,python-3.6,Python,Python 3.x,Csv,Python 3.6,创建CSV文件时,列不在我希望的正确位置。例如,列“Period”的变量是“RD”,是文件中的第二列等 有没有办法将每列的位置设置为我想要的位置 我的代码: from datetime import datetime from elasticsearch import Elasticsearch import csv es = Elasticsearch(["9200"]) res = es.search(index="search", body= {

创建CSV文件时,列不在我希望的正确位置。例如,列“Period”的变量是“RD”,是文件中的第二列等

有没有办法将每列的位置设置为我想要的位置

我的代码:

from datetime import datetime
from elasticsearch import Elasticsearch
import csv

es = Elasticsearch(["9200"])


res = es.search(index="search", body=
                {
                    "_source": ["VT","NCR","N","DT","RD"],
                    "query": {

                        "bool": {
                            "must": [{"range": {"VT": {
                                            "gte": "now/d",
                                            "lte": "now+1d/d"}}},

                                {"wildcard": {"user": "mike*"}}]}}},size=10)


csv_file = 'File_' + str(datetime.now().strftime('%Y_%m_%d - %H.%M.%S')) + '.csv'


header_names = { 'VT': 'Date', 'NCR': 'ExTime', 'N': 'Name', 'DT': 'Party', ' RD ': 'Period'}



with open(csv_file, 'w', newline='') as f:
    header_present  = False
    for doc in res['hits']['hits']:
        my_dict = doc['_source']
        if not header_present:
            w = csv.DictWriter(f, my_dict.keys())
            w.writerow(header_names,) 
            header_present = True
             w.writerow(my_dict)

使用熊猫非常简单:

import pandas as pd


# Read csv / tab-delimited in this example
df = pd.read_csv('example.csv', sep='\t')

print df

   A  B  C
0  4  5  9
1  4  5  9
2  4  5  9
3  4  5  9

# Reorder columns
df = df[['C', 'A', 'B']]

print df

   C  A  B
0  9  4  5
1  9  4  5
2  9  4  5
3  9  4  5

# Write csv / tab-delimited
df.to_csv('example.csv', sep='\t')

在处理csv文件时,最好在应用程序中使用熊猫

import pandas as pd

# Let your file have 4 columns named c1, c2, c3 and c4
# And assume you want to reorder it to c2, c3, c1, c4

data_frame = pd.read_csv('filename.csv', delimiter=',') # reading csv file as data frame with pandas

new_data_frame = data_frame[['c2', 'c3', 'c1', 'c4']] # reordered the dataframe and stored in new_data_frame

# If you want to save the result to new csv file

new_data_frame.to_csv('altered.csv', index=None)
在本例中,假设列和分隔符的顺序为“,”

import pandas as pd

csv_file_name = 'File_' + str(datetime.now().strftime('%Y_%m_%d - %H.%M.%S')) + '.csv'

data_frame = pd.read_csv(csv_file_name, delimiter=',') # change delimiter to '\t' if needed

new_data_frame = data_frame[['Party', 'Period', 'Date', 'ExTime', 'Name']]

new_data_frame.to_csv('filename.csv', index=None)

字典是不排序的,如果要强制执行列排序,则需要显式指定

import csv
headers = ['Party', 'Period', 'Date', 'ExTime', 'Name'] # Don't use my_dict.keys()
with open('header.csv', 'w') as f:
    w = csv.DictWriter(f, fieldnames=headers)
    w.writeheader()

当您调用w.writerowmy_dict时,字典将根据标题进行排序

row = {'Period':2, 'Date':3, 'Name':5, 'Party': 1, 'ExTime':4}
w.writerow(row)
输出

Party,Period,Date,ExTime,Name
1,2,3,4,5

不是那样的,我试过了it@RomanPerekhrest这是一个Elasticsearch列表,不是Python列表。结果是JSON,所以顺序没有保留请记住我的CSV文件名是用当前日期和时间生成的stamp@Rich文件名与列重新排序无关,您可以在编写CSV后将其加载到Pandas中。我如何将其与上面的代码一起使用?你能告诉我你的csv中的列标题是什么吗。?你想要什么顺序?它们列在我的代码中。因此,在我的代码中,您可以看到标题名称so-header_names={'VT':'Date','NCR':'ExTime','N':'Name','DT':'Party','RD':'Period'}。所以列是Date、ExTime、Name和Party,我有更多,但如果你告诉我如何做这将是很好的。请记住,我的CSV文件名是一个固定名称,因为它获取当前日期和时间。您真正希望更改列的顺序是什么?例如,“Party”、“Period”、“date”我试过你的建议,但没用。我想你需要告诉我如何使用我的代码。如果你不介意,你怎么会不工作?错误?我不确定这个答案是否值得下载,因为上面的代码没有获取与我相同的CSV文件名。我拥有的文件名是根据当前日期和时间生成的。这会与我的头文件名及其背后的数据冲突吗?关于文件名,您已经将csv文件作为字符串。只需使用它,而不是“header.csv”。你对此有意见吗?
Party,Period,Date,ExTime,Name
1,2,3,4,5